109

Rubyでメソッドとそのメソッドの個々のステートメントにかかる時間を測定するにはどうすればよいですか? 以下のメソッドが表示された場合、メソッドにかかった合計時間と、データベース アクセスと redis アクセスにかかった時間を測定したいと思います。すべてのステートメントの前に Benchmark.measure を書きたくありません。Ruby インタープリターは、これを行うためのフックを提供してくれますか?

def foo
# code to access database
# code to access redis. 
end
4

6 に答える 6

128

最も簡単な方法:

require 'benchmark'

def foo
 time = Benchmark.measure {
  code to test
 }
 puts time.real #or save it to logs
end

出力例:

2.2.3 :001 > foo
  5.230000   0.020000   5.250000 (  5.274806)

値は、CPU 時間、システム時間、合計および実際の経過時間です。

ソース: ruby​​ docs .

于 2015-03-20T12:26:32.140 に答える
126

オブジェクトを使用できTimeます。(タイムドキュメント)

例えば、

start = Time.now
# => 2022-02-07 13:55:06.82975 +0100
# code to time
finish = Time.now
# => 2022-02-07 13:55:09.163182 +0100
diff = finish - start
# => 2.333432

diff浮動小数点数として秒単位になります。

于 2012-07-10T04:10:09.997 に答える
50

ご利用Benchmark報告

require 'benchmark' # Might be necessary.

def foo
  Benchmark.bm( 20 ) do |bm|  # The 20 is the width of the first column in the output.
    bm.report( "Access Database:" ) do 
      # Code to access database.
    end
   
    bm.report( "Access Redis:" ) do
      # Code to access redis.
    end
  end
end

これにより、次のようなものが出力されます。

                        user     system      total        real
Access Database:    0.020000   0.000000   0.020000 (  0.475375)
Access Redis:       0.000000   0.000000   0.000000 (  0.000037)

<------ 20 -------> # This is where the 20 comes in. NOTE: This is not shown in output.

詳細については、こちらをご覧ください

于 2016-10-13T18:30:33.680 に答える