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

利用DeepSeek辅助编写带输出缓冲的Zig程序

前面通过改写Rust程序输出缓冲功能为C实现了输出速度提升以后,想将同样的思路用在Zig程序上。
又来请DeepSeek改写,第一次改写,它杜撰了一个函数bufferedWriterSize函数,查阅文档发现,只有bufferedWriter函数,但此函数只有一个参数,size固定为4096。

pub fn bufferedWriter(underlying_stream: anytype) BufferedWriter(4096, @TypeOf(underlying_stream))

将bufferedWriterSize函数替换为正确的bufferedWriter,编译通过,但执行效率没有提升。
然后试图调用底层的BufferedWriter,并传入第一个参数,编译总是出错,于是再次求助DeepSeek,它给出了解释,并提供了正确的写法:

问题分析

类型错误:BufferedWriter 是一个类型,不能直接当值使用

使用结构体初始化语法,必须提供 unbuffered_writer 字段

初始化问题:需要先创建该类型的实例

BufferedWriter(…) 是类型构造器,需要创建该类型的实例才能使用

方法调用:正确的 writer() 调用方式

不需要手动释放资源flush() 确保数据写出

    // 创建带缓冲的写入器var buffered = std.io.BufferedWriter(BUFFER_SIZE, @TypeOf(stdout)){.unbuffered_writer = stdout,};const writer = buffered.writer();...// 刷新缓冲区try buffered.flush();

完整改写后的代码如下:

const std = @import("std");
const ArrayList = std.ArrayList;pub fn main() !void {var gpa = std.heap.GeneralPurposeAllocator(.{}){};defer _ = gpa.deinit();const allocator = gpa.allocator();const output = std.io.getStdOut().writer();var stream = std.io.bufferedWriter(output);const stdout = stream.writer();// 1. Get filename from command line argumentsvar args = std.process.args();_ = args.next(); // Skip program nameconst filename = args.next() orelse {std.debug.print("Usage: program <filename>\n", .{});return;};// 2. Open and read the fileconst file = std.fs.cwd().openFile(filename, .{}) catch |err| {std.debug.print("Open file '{s}' failed: {}\n", .{ filename, err });return;};defer file.close();// 3. Read file linesconst content = try file.readToEndAlloc(allocator, std.math.maxInt(usize));defer allocator.free(content);var lines = ArrayList([]const u8).init(allocator);defer lines.deinit();var iterator = std.mem.splitScalar(u8, content, '\n');while (iterator.next()) |line| {try lines.append(line);}// 4. Sortstd.mem.sort([]const u8, lines.items, {}, compare);const BUFFER_SIZE = 64 * 1024; // 64KB 缓冲区// 创建缓冲写入器 (64KB 缓冲)//var buffered_writer = std.io.bufferedWriterWithSize(BUFFER_SIZE, stdout);var buffered_writer = std.io.BufferedWriter(BUFFER_SIZE,  @TypeOf(stdout)){.unbuffered_writer = stdout,};const writer = buffered_writer.writer();// 写入所有行for (lines.items) |line| {try writer.print("{s}\n", .{line});}// 确保所有缓冲数据被刷新try buffered_writer.flush();}fn compare(context: void, a: []const u8, b: []const u8) bool {_ = context;return std.mem.order(u8, a, b) == .lt;
}

编译执行

zig014/zig build-exe main.zig -O ReleaseFast
# 无缓冲的输出
time ./main varchar.txt >vvc.txtreal    0m3.044s
user    0m0.544s
sys     0m0.201szig014/zig build-exe mainbuf.zig -O ReleaseFast
#调用默认4096缓冲区大小的bufferedWriter
time ./mainbuf varchar.txt >vvc.txtreal    0m2.929s
user    0m0.483s
sys     0m0.196s
#调用64KB缓冲区大小的BufferedWriter
time ./mainbuf varchar.txt >vvc.txtreal    0m1.168s
user    0m0.459s
sys     0m0.094stime ./mainbuf varchar.txt >/dev/nullreal    0m0.838s
user    0m0.456s
sys     0m0.093s

需要指出输出到文件是否缓冲效率差距几倍的情况我只在WSL中看到,原生的aarch64 Linux差距微乎其微,和输出到/dev/null的差距也很小。

http://www.dtcms.com/a/314287.html

相关文章:

  • 数仓架构 数据表建模
  • 飞算 JavaAI:给需求分析装上 “智能大脑“
  • 0基礎網站開發技術教學(三) --(後端PHP篇)-- [內有2025最新可用 phpstudy2018下載鏈接]
  • 软件设计 VS 软件需求:了解成功软件开发外包的关键差异
  • 软件需求关闭前的质量评估标准是什么
  • 【LeetCode刷题集】--排序(一)
  • 深入解析SmolVLA:VLM与动作专家间的注意力机制交互
  • 嵌入式硬件中三极管原理分析与控制详解
  • sqli-libs通关教程(31-40)
  • Pytorch-速查表-常用层和模块以及使用方法
  • FPGA实现Aurora 8B10B数据回环传输,基于GTP高速收发器,提供6套工程源码和技术支持
  • 三防平板电脑是什么?这款三防平板支持红外测温!
  • Ribbon 核心原理与架构详解:服务负载均衡的隐形支柱
  • 生产环境中基于Istio的Kubernetes多集群灰度发布架构实战经验分享
  • Django 性能优化详解:从数据库到缓存,打造高效 Web 应用
  • JavaScript案例(待办事项列表)
  • vue--for循环中使用子组件,ref应该如果调用
  • SP30D120CTT大电流碳化硅二极管全面解析:TO-247封装的高功率解决方案
  • Minio部署和客户端使用 - 版本 2025-05-24T17-08-30Z
  • 计算机网络:网络号和网络地址的区别
  • [激光原理与应用-135]:光学器件 - 透镜的本质是利用材料对光的折射特性,通过特定形状的表面设计,实现对光线的会聚、发散或成像控制的光学元件
  • HTTP各个版本对比
  • 【YOLO11】【DeepSort】【NCNN】使用YOLOv11和DeepSort进行行人目标跟踪。(基于ncnn框架,c++实现)
  • 文件与目录操作命令
  • Kubernetes(k8s)之认识Pod
  • k8s简介
  • Go语言 并发安全sync
  • 深度解析:CPU 与 GPU 上的张量运算,为何“快”与“慢”并非绝对?
  • 亚马逊撤离Google购物广告:重构流量生态的战略博弈
  • 从零开始搞定类与对象(中)