複数のファイルで実行する方が、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_000ms=>[Eメール保護]wc
)sの実際の計算とは関係のない(巨大な?)開始ペナルティがあるようです\n
。