さっきのエントリ(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()の制限サイズ分まで一度で実行できることになるので、断然速い、と。