ぬけラボ

φ(..)メモメモ

Rubyでの各メソッド実行時間測定

Rubyでの各メソッド実行時間測定方法を知らなかったのでメモ
こんなコードを書いて

$ vim test.rb
arr = [:hoge,:fuga,:moge]
arr.each{|i|puts i}

実行

$ ruby -r profile test.rb
hoge
fuga
moge
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
  0.00     0.00      0.00        2     0.00     0.00  IO#set_encoding
  0.00     0.00      0.00        3     0.00     0.00  Symbol#to_s
  0.00     0.00      0.00        6     0.00     0.00  IO#write
  0.00     0.00      0.00        3     0.00     0.00  IO#puts
  0.00     0.00      0.00        3     0.00     0.00  Kernel.puts
  0.00     0.00      0.00        1     0.00     0.00  Array#each
  0.00     0.01      0.00        1     0.00    10.00  #toplevel

それっぽいのが出てきた。
rオプションでの読み込みならばコード内でrequireでも良いのではと思い。

require 'profile'
arr = [:hoge,:fuga,:moge]
arr.each{|i|puts i}

実行

$ ruby test.rb
hoge
fuga
moge
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
  0.00     0.00      0.00        2     0.00     0.00  IO#set_encoding
  0.00     0.00      0.00        3     0.00     0.00  Symbol#to_s
  0.00     0.00      0.00        6     0.00     0.00  IO#write
  0.00     0.00      0.00        3     0.00     0.00  IO#puts
  0.00     0.00      0.00        3     0.00     0.00  Kernel.puts
  0.00     0.00      0.00        1     0.00     0.00  Array#each
  0.00     0.01      0.00        1     0.00    10.00  #toplevel

同じ結果が得られた。

詳しい説明はリファレンスマニュアルの方に
http://www.ruby-lang.org/ja/old-man/html/profile.html

またこちらの下の方に以下の補足がある。
>profileはそれ自身がオーバーヘッドになるためメソッド呼び出しあたりの処理時間がかなり遅くなります。[RAA:RbProf]というのがあり、こちらの方が速いようです