複数のパスのwcが1つずつ実行するよりもはるかに速いのはなぜですか?

複数のパスのwcが1つずつ実行するよりもはるかに速いのはなぜですか?

複数のファイルで実行する方が、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を1回ではなく複数回実行しますが、このコンテキストでは重要ではありません。)

私はwcすべてのファイルを開いて処理する必要があるので、スピードアップはマルチスレッドでのみ行わなければならないと思っていました。しかし、ここでは、追加のファイルシステムの魔法が進行中である可能性があることを読んでいます。

ここに3つのファイルシステムの魔法がありますか、それともすべてマルチスレッドですか、それとも別のものですか?


罰の有効化

@muruのコメントによると、a)単一の実行に約8msかかり、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=>[Eメール保護]wc)sの実際の計算とは関係のない(巨大な?)開始ペナルティがあるようです\n

ベストアンサー1

おすすめ記事