Rubyでちょっとしたコードを書いた時、ふと、
「実行時間はどのぐらいかかっているんだろうか?」
と思うことがないでしょうか。
実行時間計測の方法自体は、既に先人の方々がまとめているため、リンクを紹介しておきます。
Rubyで処理の時間計測方法
http://qiita.com/yakiimo23/items/7293c7606c1d59501d89
Rubyでプログラムの処理速度を計測する
http://qiita.com/tamano/items/6317b26625651b4d0def
Rubyでベンチマークを取る方法
http://qiita.com/scivola/items/c5b2aeaf7d67a9ef310a
やったこと
各やり方を比較してみると、
「Time.now
でやると、コードは簡潔に書けるが、ms単位でしか測れないため、短時間で実行が終わるコードには使えない。」
「benchmark
を使うと、詳細な実行時間を取れるが、実行時間を表示するコードを書くのに数ステップ書かないといけない。」(※)
ということがわかります。
というわけで、両者の短所を埋めるべく 「1ステップで書けて」「詳細な実行時間が取得できる」 ように、benchmark
の利用部をラップしたコードを書いてみました。
(※)benchmark
を使っても、短い時間で終わる処理の正確な実行時間は測れません。こちらの記事の説明にもある通り、CPU時間が 0.01秒とかになるようなベンチマークテストをやっても、有効数字ゼロ桁の結果しか得ることができないのです。
コード
require 'benchmark'
def measure_do
result = Benchmark.measure do
yield
end
puts Benchmark::CAPTION
puts result
end
使い方
使い方は簡単。
require
していただいた上で、
measure_do { __計測したい処理__ }
を書くだけです。
一応、使った場合のサンプルも載せておきます。
require './process_measure.rb'
measure_do { 100000000.times { |i| a = i } }
measure_do { 1000000000.times { |i| a = i } }
$ ruby sample.rb
user system total real
6.230000 0.020000 6.250000 ( 6.276192)
user system total real
12.550000 0.040000 12.590000 ( 12.642582)
おわりに
やっていることは単純ですが、サンドボックス的なプロジェクトに置いておくと、
簡単に実行時間計測を書くことができて便利です。