使用多个文件运行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
。