当前位置: 首页 > 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.lryc.cn/news/608395.html

相关文章:

  • Python爬虫实战:研究SimpleCV技术,构建图像获取及处理系统
  • vulnhub-ELECTRICAL靶场攻略
  • 基于OAuth2与JWT的微服务API安全实战经验分享
  • AbstractExecutorService:Java并发核心模板解析
  • Batch Normalization(BN):深度学习中的“训练加速器”与实践指南
  • Vue 详情模块 3
  • 洛谷 P3372 【模板】线段树 1-普及+/提高
  • 星际漫游闪耀2025LEC全球授权展,三大IP与文旅AI打印机共绘国潮宇宙新篇章
  • 【走遍美国精讲笔记】第 1 课:林登大街 46 号
  • 深入 Go 底层原理(一):Slice 的实现剖析
  • 波士顿咨询校招面试轮次及应对策略解析
  • PYTHON从入门到实践-18Django从零开始构建Web应用
  • 二叉搜索树(C++实现)
  • 蓝桥杯----串口
  • [硬件电路-120]:模拟电路 - 信号处理电路 - 在信息系统众多不同的场景,“高速”的含义是不尽相同的。
  • MyBatis与MySQL
  • 驾驶场景玩手机识别:陌讯行为特征融合算法误检率↓76% 实战解析
  • 综合:单臂路由+三层交换技术+telnet配置+DHCP
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月2日第154弹
  • 位菜:仪式锚与价值符
  • 先学Python还是c++?
  • Mybatis学习之各种查询功能(五)
  • Web 开发 10
  • stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(二)
  • sqli-labs:Less-20关卡详细解析
  • 沿街晾晒识别准确率↑32%:陌讯多模态融合算法实战解析
  • Linux网络-------4.传输层协议UDP/TCP-----原理
  • QUdpSocket 详解:从协议基础、通信模式、数据传输特点、应用场景、调用方式到实战应用全面解析
  • kong网关集成Safeline WAF 插件
  • 力扣刷题日常(11-12)