当前位置: 首页 > news >正文

利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率

在前面多语言测试中,遇到一个难以置信的问题,rust的输出到文件比c语言还快,这是不合情理的,通过对两者输出语句的比较,发现了不同。
rust程序在输出到stdout前有这么一句

let mut writer = BufWriter::with_capacity(64 * 1024, stdout.lock());

而c语言是直接输出。
将上述语句发给DeepSeek,它给出了等价的C语言实现。

#define BUFFER_SIZE (64 * 1024)  // 64KB 缓冲区// 设置 stdout 缓冲char buffer[BUFFER_SIZE];if (setvbuf(stdout, buffer, _IOFBF, sizeof(buffer)) != 0) {perror("setvbuf failed");return EXIT_FAILURE;}// 原输出语句// 刷新缓冲区if (fflush(stdout) != 0) {perror("fflush failed");return EXIT_FAILURE;}

加入上述语句的c代码编译运行情况如下:

gcc sort_lines_buf.c -o csortbuf -O3
time ./csortbuf varchar.txt >vvc.txtreal    0m1.367s
user    0m0.431s
sys     0m0.086s
time ./csortbuf varchar.txt >/dev/nullreal    0m0.792s
user    0m0.406s
sys     0m0.063s

而加入缓冲前

time ./c_sort varchar.txt >vvc.txtreal    0m3.568s
user    0m0.439s
sys     0m0.226s
time ./c_sort varchar.txt >/dev/nullreal    0m0.758s
user    0m0.335s
sys     0m0.080s

可见,缓冲后输出到文件的时间缩短到原来的1/3,而不输出文件的保持不变。
需要指出,这个缓冲区并非越大越好,它受限于栈容量,如果改成从堆分配和文件大小一样的内存做缓冲区,反而比不缓冲更慢。
完整带缓冲输出c代码摘录如下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define MAX_LINES 1000000  // 最多100万行
#define BUFFER_SIZE (64 * 1024) // 64KB 缓冲区
int compare_offsets(const void *a, const void *b) {return strcmp(*(const char **)a, *(const char **)b);
}int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "Usage: %s <filename>\n", argv[0]);return 1;}// 打开文件并获取大小int fd = open(argv[1], O_RDONLY);if (fd == -1) {perror("open");return 1;}struct stat st;if (fstat(fd, &st) == -1) {perror("fstat");close(fd);return 1;}size_t file_size = st.st_size;// 分配缓冲区并读取文件char *buf = malloc(file_size + 1);if (!buf) {perror("malloc");close(fd);return 1;}if (read(fd, buf, file_size) != file_size) {perror("read");free(buf);close(fd);return 1;}close(fd);buf[file_size] = '\0';  // 确保以null结尾// 记录每行起始地址char *lines[MAX_LINES];size_t line_count = 0;lines[line_count++] = buf;  // 第一行开始// 遍历缓冲区,记录每行起始地址并将\n替换为\0for (char *p = buf; *p && line_count < MAX_LINES; p++) {if (*p == '\n') {*p = '\0';if (*(p + 1)) {  // 如果不是文件末尾lines[line_count++] = p + 1;}}}// 对行指针数组进行排序qsort(lines, line_count, sizeof(char *), compare_offsets);// 设置 stdout 缓冲char buffer[BUFFER_SIZE];if (setvbuf(stdout, buffer, _IOFBF, sizeof(buffer)) != 0) {perror("setvbuf failed");return EXIT_FAILURE;}// 写入数据for (int i = 0; i < line_count; i++) {if (printf("%s\n", lines[i]) < 0) {perror("printf failed");return EXIT_FAILURE;}}// 刷新缓冲区if (fflush(stdout) != 0) {perror("fflush failed");return EXIT_FAILURE;}free(buf);return 0;
}
http://www.dtcms.com/a/310906.html

相关文章:

  • 自动化革命:软件开发的引擎与未来蓝图
  • carla-0.10.0 矿山地图和autoware联调
  • Rust进阶-part2-泛型
  • VAST视频广告技术实现:从零开始搭建视频广告投放系统
  • 大模型笔记1——李宏毅《2025机器学习》第一讲
  • 中科院自动化所机器人视觉中的多模态融合与视觉语言模型综述
  • 【Java】在一个前台界面中动态展示多个数据表的字段及数据
  • 第三阶段—8天Python从入门到精通【itheima】-141节(pysqark实战——数据输入)
  • True or False? 基于 BERT 学生数学问题误解检测
  • Python 第一阶段测试题 答案及解析
  • Vuex 4.0:Vue.js 应用的状态管理新篇章
  • SLAM中的非线性优化-2D图优化之零空间实战(十六)
  • TiDB 和 MySQL 的迁移过程是什么?会遇到什么问题?怎么解决的?
  • 编译器工作原理的显微镜级拆解
  • 【读代码】 KAG项目:开源知识图谱自动构建与推理平台原理与实践
  • PYTHON从入门到实践-18Django从零开始构建Web应用
  • SpringBoot3.x入门到精通系列:2.1 自动配置原理
  • 【软考中级网络工程师】知识点之 VRRP
  • 关于Web前端安全防御CSRF攻防的几点考虑
  • 关于人工智能AI>ML>DL>transformer及NLP的关系
  • MySQL(173)MySQL中的存储过程和函数有什么区别?
  • 【DeepSeek-R1 】分词系统架构解析
  • 快速了解决策树
  • API征服者:Python抓取星链卫星实时轨迹
  • Docker 部署与配置 MySQL 5.7
  • 四、Portainer图形化管理实战与Docker镜像原理
  • 2024年网络安全案例
  • 从数据丢失到动画流畅:React状态同步与远程数据加载全解析
  • Jotai:React轻量级原子化状态管理,告别重渲染困扰
  • 《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》