見せてもらおうか、xargsの威力とやらを

さっきのエントリ(execve()の制限 (Argument list too long))の調べついでに思い出したので、タイトルの件、Apache2.2.11のソースコード一式で試してみた。

検証環境は、Amazon EC2(Small Instance)のFedora8(kernel2.6.21-xen)。

$ time find . -name \*.c -exec grep hoge {} \;
real    0m1.734s
user    0m0.184s
sys     0m0.564s

$ time find . -name \*.c | xargs grep hoge
real    0m0.105s
user    0m0.016s
sys     0m0.016s

わかっていたけど、やっぱり全然違うなぁ。

一応簡単に説明しておくと、findだと"*.c"のファイル数分だけ、grepを実行。find+xargsだとgrepの引数となるファイルパス群が、execve()の制限サイズ分まで一度で実行できることになるので、断然速い、と。