すがブロ

sugamasaoのhatenablogだよ

str == "" と str.empty?

どっちが効率的なのか

個人的には明示的にメソッドを使っている方を好むのだけど、速度的にはどうなのか。
10回ずつ試してみた。

str == "" の場合

/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 71% cpu 0.014 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 75% cpu 0.015 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 75% cpu 0.013 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 75% cpu 0.013 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 74% cpu 0.010 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 52% cpu 0.016 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 78% cpu 0.013 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 75% cpu 0.014 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 63% cpu 0.013 total
/tmp% time ruby -e'str=""; 10000.times { str == "" }'
ruby -e'str=""; 10000.times { str == "" }' 0.01s user 0.00s system 69% cpu 0.013 total

str.empty? の場合

/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 78% cpu 0.013 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 69% cpu 0.012 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 83% cpu 0.011 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 70% cpu 0.014 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 81% cpu 0.010 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 73% cpu 0.012 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 67% cpu 0.013 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 72% cpu 0.012 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.01s user 0.00s system 84% cpu 0.010 total
/tmp% time ruby -e'str=""; 10000.times { str.empty? }'
ruby -e'str=""; 10000.times { str.empty? }' 0.00s user 0.00s system 90% cpu 0.007 total

結論

一応上記で値は出したものの、正確に平均を計算していなので*1パッと見だけで判断すると、CPU的には empty? の方が負荷が掛かっているけれど、 total の値でみると、若干少ない。
ということは、速度で言えば empty? に分があるということか。
10000回繰り返してこの程度の差ということは無視しても良いレベルなんだろうけど・・・。

環境は

例のごとく Mac OSXです。

/tmp% ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]

*1:しろよ