为什么多条路径的wc比一条一条执行快很多?

为什么多条路径的wc比一条一条执行快很多?

使用多个文件运行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_000m​​s=>[电子邮件受保护])似乎存在(巨大的?)启动惩罚,其wc与实际计算 s 无关\n

相关内容