builtin と fork/exec と
コメント欄から
最後の例がそこそこ速いように見えていますが、echo じゃなくてディスクに触る処理だと結果は大きく変わるのでは。
いやいやいや。そういう話ではなくて、echo は shell の組み込みだから fork していないだけの話ですよ。以下、zsh で
% find -type f -name '*.java' | wc -l 267 % time find -type f -name '*.java' | sed 's!^!echo !' | sh > /dev/null find -type f -name '*.java' 0.01s user 0.01s system 73% cpu 0.027 total sed 's!^!echo !' 0.01s user 0.00s system 26% cpu 0.030 total sh > /dev/null 0.02s user 0.01s system 63% cpu 0.044 total % time find -type f -name '*.java' | sed 's!^!/bin/echo !' | sh > /dev/null find -type f -name '*.java' 0.02s user 0.00s system 57% cpu 0.035 total sed 's!^!/bin/echo !' 0.01s user 0.00s system 7% cpu 0.114 total sh > /dev/null 1.22s user 0.30s system 99% cpu 1.531 total
fork/exec のコストをなめてはいけない。
当然1プロセスの処理時間がそれなりにあるなら、相対的に fork のコストは小さくなって、誤差範囲になるけども、echo や rm なんかの単純な処理をする場合は、fork/exec する回数がそのまま実行時間に響くわけです。