LoginSignup
2
2

More than 5 years have passed since last update.

Rubyで実行時間計測をラップしたコードを書いてみた

Last updated at Posted at 2017-02-12

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秒とかになるようなベンチマークテストをやっても、有効数字ゼロ桁の結果しか得ることができないのです。

コード

process_measure.rb
require 'benchmark'

def measure_do
  result = Benchmark.measure do
    yield
  end

  puts Benchmark::CAPTION
  puts result
end

使い方

使い方は簡単。
requireしていただいた上で、

書き方
measure_do { __計測したい処理__ }

を書くだけです。
一応、使った場合のサンプルも載せておきます。

sample.rb
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)

おわりに

やっていることは単純ですが、サンドボックス的なプロジェクトに置いておくと、
簡単に実行時間計測を書くことができて便利です。

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2