Rubyの無限ループ処理の速度を比較してみた
Rubyの学習をしていて、無限ループを書くためにloopメソッドが用意されていることを知りました。
while文で十分なのに、わざわざ個別にメソッドを用意する理由は速度か?と疑問に思ったので実測してみました。
計測方法
1000万回ループしたらbreakするプログラムをloopメソッド、while文、until文で書いてみました。
loopメソッドの場合は以下の様になります。
LOOP_MAX = 10000000
loop_count = 0
loop do
loop_count += 1
if loop_count >= LOOP_MAX
break
end
end
while文の場合は4行目がwhile 1に変わり、until文の場合も同様に4行目だけがuntil 0に変わります。
計測するためのコマンド
計測にはtimeコマンドのuser項目を利用します。
計測結果
それぞれのテストプログラムを10回計測し集計すると、下表の様になりました。
集計項目 | loopメソッド(sec) | while文(sec) | until文(sec) |
---|---|---|---|
平均 | 0.8473 | 0.3658 | 0.0787 |
最大 | 0.8900 | 0.4220 | 0.0860 |
最小 | 0.8170 | 0.3490 | 0.0760 |
中央値 | 0.8405 | 0.3565 | 0.0780 |
当初の予想に反して、loopメソッドの方が遅い結果になりました。
予想外だったのが、until文のダントツの速さです。
無限ループはwhile文で書こうと思っていたのですが、速度という名の正義を眼前に突きつけられてはuntil文を使うしかありません。 因みに、until 0でなくuntil !1で無限ループさせると中央値が0.4980secと極端に遅くなりました。
最後に
まだ学習を始めてまもないRubyですが、ifとunless、whileとuntilみたいにムダに文法を用意しすぎだと感じるのは私だけでしょうか?
以上です。
ここまで読んでいただき、ありがとうございました。