Ruby - 処理実行時間計測!

Updated:


ご存知の方も多いと思いますが、Ruby での処理の実行時間計測方法についてです。

Ruby に限らずよくある方法に、処理前と処理後の時間差を計算する方法があります。

Ruby ではこの方法以外に、ベンチマークを取るためのクラス Benchmark を使う方法もあります。 こちらを参照。

実際に、処理時間を計測してみました。

検証記録

1.検証用Rubyスクリプト

階乗を計算する処理3種類で計測して比較するようにしてみました。 ※2の10乗(= 1,024)の階乗を10の3乗(= 1,000)回処理。 library benchmark によると出力書式等を細かく設定することも可能ですが、一番単純な方法でも充分です。

require 'benchmark'

# 階乗を普通に計算
def fact_1( n )
  f = 1
  if n == 0
    f
  else
    ( 1..n ).each do |i|
      f = f * i
    end
  end
end

# 階乗を再帰的に計算
def fact_2( n )
  if n == 0
    1
  else
    fact_2( n - 1 ) * n
  end
end

# 階乗を Ruby ならではの inject を使って計算
def fact_3( n )
  ( 1..n ).to_a.inject( 1 ) do |f, i|
    f * i
  end
end

cnt = 10 ** 3
num = 2 ** 10

# ヘッダキャプション
puts Benchmark::CAPTION

# 階乗を普通に計算
puts Benchmark.measure {
  cnt.times { res = fact_1( num ) }
}

# 階乗を再帰的に計算
puts Benchmark.measure {
  cnt.times { res = fact_2( num ) }
}

# 階乗を Ruby ならではの inject を使って計算
puts Benchmark.measure {
  cnt.times { res = fact_3( num ) }
}

2.実行結果

      user     system      total        real
  2.281000   0.000000   2.281000 (  2.063000)
  2.063000   0.000000   2.063000 (  1.991000)
  2.547000   0.000000   2.547000 (  2.194000)

何回か実行してみた結果、階乗を計算するには再帰的に計算するのが若干速いようです。 (実行環境により違いがあるのかもしれませんが)


一番単純な方法は上記のように、計測したい処理を “puts Benchmark.measure {“ と “}” で挟めばよいのです。

以上です。





 

Sponsored Link

 

Comments