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