起因是看到一篇文章,作者介绍了如何用 Rust 优化 yes 命令,第一个 buffer 的版本还比较好懂,第二个复用 buffer 的就没有那么直接了。想了下用 Zig 实现会是怎么样?于是就有了下面的测试:
测试时会用到 pv 命令,需要单独安装
初始版
|
|
编译运行
|
|
速度大概是 [2.77MiB/s]
笔者使用机器(macOS m1)上默认的 yes
命令速率: [5.31GiB/s]
,这差距不是一点两点,下面来一步步优化。
BufferedWriter 版本
|
|
速度大概是 116Mib/s
。
这个版本主要是利用了 bufferedWriter ,Zig 标准库默认是 4096,写入达到阈值一次性刷到底层 Writer 中,相当于变相减少了系统调用的次数。
复用 Buffer 版本
|
|
速率大概是: [2.70GiB/s]
这个版本相比上个版本,除了减少系统调用外,通过复用同一个 buffer 减少了数据拷贝的代价。但还是赶不上系统版本的速度,可以通过增加 buffer 大小进一步提高吞吐。
当调整为 64*1024
时,速度大概是 [6.44GiB/s]
,再调大这个值速度也不会有显著提升,说明这已经达到磁盘写入上限了。