bashでtestを使うと遅いよ

bashでは

if [ $a -eq 0 ] ...

と書く代わりに

if [[ $a -eq 0 ]] ...

と書ける。 test ( [] ) は外部コマンドだから評価のときに毎回forkして遅いような気がする。一方 [[]] は内部コマンドだからforkしなくて速いのではないかと思ったのでベンチマークを取ってみた。

ベンチマーク

for a in $(seq 1 100000) ; do [ 0 -eq 100 ] ; done
for a in $(seq 1 100000) ; do [[ 0 -eq 100 ]] ; done

結果

real    0m0.535s
user    0m0.517s
sys     0m0.017s

real    0m0.353s
user    0m0.347s
sys     0m0.007s

予想通り [[]] の方がまあまあ速かった。因みに [[]] の方では正規表現マッチなど機能が追加されている。互換性を追求するなどの理由がない限り [[]] を使った方が良さそう。