如何提升MINGW64管道速度?第三条命令为何运行缓慢?
命令慢的原因与优化方案
先看你给出的命令运行结果:
a@DESKTOP-OCHDMBI MINGW64 ~ $ time head -c 1G </dev/zero >/dev/null real 0m0.141s user 0m0.109s sys 0m0.000s a@DESKTOP-OCHDMBI MINGW64 ~ $ time head -c 1G </dev/zero | cat >/dev/null real 0m0.221s user 0m0.171s sys 0m0.263s a@DESKTOP-OCHDMBI MINGW64 ~ $ time cat </dev/zero | head -c 1G | cat >/dev/null real 0m2.065s user 0m0.608s sys 0m3.185s
第三条命令变慢的核心原因
- 管道数据流向的差异:前两条命令里
head是第一个环节,它直接从/dev/zero读取1G数据后就停止输出,后面的cat只需要处理这1G有限数据。但第三条命令里,cat会持续从/dev/zero输出无限数据,head取满1G后就退出,此时管道的读端关闭,但cat还在尝试往管道里写数据。 - MINGW管道的适配问题:MINGW基于Windows匿名管道实现,和Linux原生管道机制不同。当
head退出后,cat往已关闭的管道写数据会触发错误,但MINGW下的cat没有及时终止,反而反复尝试写入,产生了大量系统调用(从sys时间3.185s远高于前两条就能看出来),直接拖慢了整体速度。
优化方法,让速度接近前两条
- 调整命令顺序,让截断命令前置:把
head放在最前面,直接读取/dev/zero生成1G数据,比如把第三条命令改成head -c 1G </dev/zero | cat >/dev/null,和第二条命令一致,速度自然就上去了。如果一定要用cat读取输入,也可以写成head -c 1G /dev/zero | cat >/dev/null,效果相同。 - 给
cat加无缓冲参数:尝试用cat -u </dev/zero | head -c 1G | cat -u >/dev/null,关闭cat的缓冲,让它能更快感知到管道读端关闭,及时停止写入,减少无效的系统调用。 - 升级MINGW环境:换成MSYS2最新版本,里面的GNU工具对Windows管道的处理更优化,能更好地应对管道提前关闭的场景。
关联到pigz速度慢的解决思路
你提到MINGW里pigz速度慢,推测是输入数据速度不足,本质和上面的问题类似:
- 避免用
cat传递数据:直接让pigz读取文件,比如用pigz < filename代替cat filename | pigz,减少管道带来的开销。 - 控制输入数据的量:如果输入是无限流,确保前面的命令能在pigz退出后及时停止输出,比如用
head先截断数据再传给pigz。 - 调整pigz的块大小:用
-b参数设置更大的块大小(比如pigz -b 65536),减少系统调用次数,提升处理效率。
内容的提问来源于stack exchange,提问作者Anton Duzenko
相关产品推荐
相关产品推荐

