zsh で which と command -v の速度比較

雑記。

以前 Bash ではコマンドの有無の確認に which ではなく command -v を使った方がいいという旨を見た覚えがあったので、Zsh ではどうかを調べてみた。

$ zsh --version
zsh 5.7.1 (x86_64-apple-darwin17.7.0)

まずは $PATH 内にあるコマンドで確認

for ((i=0;i<100000;i++)); do
  which node >/dev/null 2>&1
done
for ((i=0;i<100000;i++)); do
  command -v node >/dev/null
done

結果

$ time zsh which.sh
zsh which.sh  1.78s user 2.53s system 95% cpu 4.493 total

$ time zsh command.sh
zsh command.sh  1.37s user 2.16s system 94% cpu 3.737 total

command -v の方が有意に早い。

続いて存在しないコマンドの場合。

for ((i=0;i<100000;i++)); do
  which node >/dev/null 2>&1
done
for ((i=0;i<100000;i++)); do
  command -v node >/dev/null
done

結果

$ time zsh which.sh
zsh which.sh  2.30s user 3.06s system 94% cpu 5.655 total
$ time zsh command.sh
zsh command.sh  1.79s user 2.60s system 94% cpu 4.617 total

遅くなった分、より差がつく結果に。

ということで command -v の方が早い模様。1回の呼び出しで体感できるほどではないものの、塵も積もればなんとやらなので、.zshrc では command -v を使ったほうがいいだろう。