読者です 読者をやめる 読者になる 読者になる

鴨川にあこがれる日々

軽い技術っぽい記事かいてます

Rubyにおける繰り返し処理の比較

はじめに

知人とこんな話題になりました.*1

ある値からある値までデクリメントしながら繰り返し処理をしたいとき,
なにを使ったらよいのかということです.

気になったので検証しました.
個人的な結論は,downtoを使います.

環境

  • ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]

本題

単純にbenchmarkをとった結果で比較しました.
(取り方が間違っていたらすみませんが,ご指摘いただければと思います)

realで比較します.

コードはこちら

require 'benchmark'
n = 500000

Benchmark.bm(12) do |x|
  x.report("for:"){ for i in (0..n).to_a.reverse; end }
  x.report("downto:"){ n.downto(0) do |i|; end }
  x.report("reverse_each:"){ (0..n).reverse_each do |i|; end}
end

結果はこちら

                   user     system      total        real
for:           0.080000   0.010000   0.090000 (  0.117528)
downto:        0.040000   0.000000   0.040000 (  0.048465)
reverse_each:  0.080000   0.000000   0.080000 (  0.098734)

速い順に並べると
downto < reverse_each < for

でした.

謝辞

reverse_withを教えてくださった@polamjagさま
(0..n).to_a.reverseを教えてくださった@himktさま
ありがとうございます.

*1:downtoの知名度が本当に低いかは,本題から外します