![为什么多条路径的wc比一条一条执行快很多?](https://linux22.com/image/229760/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%A4%9A%E6%9D%A1%E8%B7%AF%E5%BE%84%E7%9A%84wc%E6%AF%94%E4%B8%80%E6%9D%A1%E4%B8%80%E6%9D%A1%E6%89%A7%E8%A1%8C%E5%BF%AB%E5%BE%88%E5%A4%9A%EF%BC%9F.png)
使用多个文件运行wc
比逐个文件运行要快一个数量级。例如:
> time git ls-files -z | xargs -0 wc -l > ../bach.x
real 0m2.765s
user 0m0.031s
sys 0m2.531s
> time git ls-files | xargs -I {} wc -l "{}" > ../onebyone.x
real 0m57.832s
user 0m0.156s
sys 0m3.031s
(该存储库包含 ~10_000 个文件,因此 xargs 运行 wc 几次,而不仅仅是一次,但这在本上下文中并不重要)
我天真地认为wc
需要打开并处理每个文件,因此加速必须仅来自多线程。然而,我读到这里可能有一些额外的文件系统魔法。
这里是三个文件系统的魔力,还是都是多线程的,还是其他的?
启动惩罚
根据 @muru 的评论,我可以看到 a) 单次执行约为 8 毫秒,b)wc
在循环中运行呈线性扩展:
> time wc -l ../x.x > /dev/null
real 0m0.008s
user 0m0.000s
sys 0m0.016s
> time for run in {1..10}; do wc -l ../x.x; done > /dev/null
real 0m0.076s
user 0m0.000s
sys 0m0.000s
> time for run in {1..100}; do wc -l ../x.x; done > /dev/null
real 0m0.689s
user 0m0.000s
sys 0m0.063s
由于每个文件的多文件运行速度要快得多(10_000f@3_000ms=>[电子邮件受保护])似乎存在(巨大的?)启动惩罚,其wc
与实际计算 s 无关\n
。