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 する回数がそのまま実行時間に響くわけです。