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 {“ と “}” で挟めばよいのです。
以上です。
Comments