利用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.pswp.cn/diannao/94064.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Optional 类教程详解

一、Optional 类核心定位Optional 是 Java 8 引入的函数式容器类&#xff08;java.util.Optional&#xff09;&#xff0c;专为​​显式空值处理​​设计。其核心价值在于&#xff1a;消除 60% 以上的传统 null 检查代码通过类型系统强制空值声明&#xff0c;降低 NPE 风险支持…

Agent X MCP 把想法编译成现实

多模态GUI智能体协作型AI魔搭社区MCPMCP 硬件

cv快速input

效果<view class"miniWhether-box-lss"><view class"content-inp-text">快递单号</view><input class"content-inp-input" type"text"v-model"expressInfo.expressNo" placeholder"填写快递单号&…

[AI8051U入门第十二步]W5500-Modbus TCP从机

学习目标: 1、了解Modbus Tcp协议 2、学习Modbus Tcp 从机程序驱动 3、使用 Modbus Pull调试一、Modbus TCP介绍? Modbus TCP 是一种基于 TCP/IP 网络的工业通信协议,是 Modbus 协议家族中的一员,专门为以太网环境设计。它是 Modbus RTU(串行通信)协议的扩展,将 Modbus…

Python编程基础与实践:Python循环结构基础

循环结构 学习目标 通过本课程的学习&#xff0c;学员可以掌握Python中for循环和while循环的基本使用方法&#xff0c;了解如何利用循环结构来重复执行代码块&#xff0c;以及如何使用break和continue语句来控制循环的执行流程。 相关知识点 循环结构 学习内容 1 循环结构 1.1 …

趣谈设计模式之模板方法模式-老板,你的数字咖啡制作好了,请享用!

模板方法模式 定义了一套算法的骨架&#xff0c;讲某些具体的步骤延迟到子类中实现。 主要用于不改变算法结构的情况下重新定义算法的某些步骤&#xff0c;以适应新的需求。 模板方法的角色 抽象类&#xff1a; 作为算法的骨架&#xff0c;该抽象类中包含了算法的核心部分和…

技术栈:基于Java语言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平台

一、市场背景1、社会发展与生活方式转变城市化进程加快&#xff1a;随着城市化不断推进&#xff0c;大量人口涌入城市&#xff0c;人们生活的物理空间距离拉近了&#xff0c;但人际关系却在一定程度上变得疏离。传统的基于血缘、地缘建立起的紧密社交关系难以满足城市生活中的多…

字典在VBA与VB.NET的区别,举例说明

简述&#xff1a;在VBA中&#xff0c;字典通常使用Scripting.Dictionary对象&#xff0c;通过CreateObject("Scripting.Dictionary")创建。它需要引用Microsoft Scripting Runtime库&#xff08;scrrun.dll&#xff09;。VBA字典的方法包括Exists、Add、Remove等&…

2024年网络安全案例

以下是2024年造成严重损失的网络安全典型案例&#xff0c;涵盖市政系统、金融交易、区块链平台、国家级攻击及全球性IT故障五大领域&#xff0c;按损失规模和技术危害性综合排序&#xff1a;---一、市政基础设施攻击 1. 加拿大汉密尔顿市勒索软件事件 - 损失&#xff1a;183…

PINN+贝叶斯:深度学习中的魔改新思路

2025深度学习发论文&模型涨点之——PINN贝叶斯PINN通过将物理定律&#xff08;如偏微分方程PDEs&#xff09;嵌入神经网络的损失函数中&#xff0c;使得模型能够利用已知的物理规律来指导学习过程&#xff0c;从而在数据有限或噪声较多的情况下实现更高的准确性。然而&…

零基础-动手学深度学习-8.3. 语言模型和数据集

很至关重要的一章: 8.3.1. 学习语言模型 8.3.2. 马尔可夫模型与n元语法 n元语法看的序列长度是固定的&#xff0c; 存储的序列长是有限且可控的&#xff0c;使用统计方法的时候通常使用这个模型&#xff01;&#xff01;&#xff01;统计方法&#xff01;&#xff01;&#x…

C++ 模板初阶

什么是模板&#xff1f; 模板&#xff08;Template&#xff09;是 C 中实现泛型编程的核心工具。它允许我们编写与具体数据类型无关的代码&#xff0c;从而实现代码复用和类型安全。为什么需要模板&#xff1f; 举个生活中的例子&#xff1a;如果你要造一个能装水的杯子&#x…

DockerFile文件执行docker bulid自动构建镜像

文章目录一、Dockerfile介绍二、Dockerfile镜像制作和流程使用三、Dockerfile文件的制作镜像的分层结构四、Dockerfile文件格式五、Dockerfile相关指令5.1 FROML&#xff1a;指定基础镜像5.2 LABEL&#xff1a;指定镜像元数据5.3 RUN&#xff1a;执行shell指令5.4 ENV&#xff…

osloader!DoGlobalInitialization函数分析之HW_CURSOR--NTLDR源代码分析之设置光标

第一部分&#xff1a; VOID DoGlobalInitialization(IN PBOOT_CONTEXT BootContextRecord){//// Turn the cursor off//HW_CURSOR(0,127);D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)第二部分&#xff…

Elasticsearch 索引及节点级别增删改查技术

以下是针对 Elasticsearch 索引及节点级别增删改查技术做的简短总结&#xff1a; 一、索引操作创建索引 功能&#xff1a;指定分片、副本数及映射规则[2][4]。示例&#xff1a;PUT /<index_name>​&#xff0c;可定义 settings&#xff08;如分片数&#xff09;和 mappin…

烽火HG680-KD_海思MV320处理器-安卓9-原厂系统升级包-针对解决烧录不进系统的问题

烽火HG680-KD_海思MV320处理器-安卓9-原厂系统升级包&#xff08;注意是&#xff08;原机系统&#xff09;&#xff09;-主要是针对解决TTL烧录后仍然不进系统使用。HG680-KD&#xff0f;HG680-KE&#xff0f;HG680-KF&#xff0f;HG680-KX 均通用。 说明&#xff1a; 前一个…

VS2019安装HoloLens 没有设备选项

第一步先检查VS有没有安装C组件第二步把VS工程最后一个设置为启动项

【云计算】云主机的亲和性策略(二):集群节点组

《云主机的亲和性策略》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 云主机的亲和性策略&#xff08;一&#xff09;&#xff1a;快乐旅行团2️⃣ 云主机的亲和性策略&#xff08;二&#xff09;&#xff1a;集群节点组3️⃣ 云主机的亲和性策略&#xff08;三&#xf…

【人工智能】AI代理在零售业的崛起:从草莓订购到全流程购物体验

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在零售业快速演变的格局中,AI代理正作为变革力量崛起,连接消费者需求与无缝履行。本文深入探讨AI代理在零售中的兴起,从通过对话界面订购…

【读论文】从Qwen3技术报告到Qwen3-30B-A3B 模型的深度解读

引言:当大模型追求又小又好用 最近都是各种新大模型满天飞,其中Qwen3-30B-A3B-Instruct-2507很是亮眼,这种参数尺寸是相对友好的,效果好而且模型不大。从这里就引发一下疑问,如何在保证强大能力的同时,兼顾模型的效率和可访问性?毫无疑问,混合专家 (Mixture-of-Expert…