mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - 処理実行時間計測!

[ プログラミング, 数学 ] [ Ruby ]

こんばんは。

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

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

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

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

検証記録

1.検証用Rubyスクリプト

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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.実行結果

1
2
3
4
  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