6

Benchmark現在時間計測を行っているので、クラスやコマンドラインユーティリティを使わずにユーザー時間やシステム時間を計測できないかと考えてみましたtime

クラスを使用するTimeと、システム時間とユーザー時間ではなく、ウォールクロック時間のみが明らかになりますが、同じ柔軟性を持つソリューションを探しています。

time = TimeUtility.now
# some code
user, system, real = TimeUtility.now - time

その理由は、Benchmark数字だけを返すことができないため、どういうわけか嫌いだからです(編集:私は間違っていました-できる。以下の回答を参照してください。)。確かに、出力を解析できましたが、それは正しくありません。*NIX システムのtimeユーティリティも私の問題を解決するはずですが、Ruby に何らかのラッパーが既に実装されているかどうかを知りたかったので、これらのシステム コールを自分で行う必要はありません。

どうもありがとう!

4

3 に答える 3

9

Benchmark のドキュメントを読み直したところ、 という名前のメソッドがあることがわかりましたmeasure。このメソッドはまさに私が望むことを行います: コードが必要とする時間を測定し、ユーザー時間、システム時間、子供のシステム時間などを含むオブジェクトを返します。

require 'benchmark'
measurement = Benchmark.measure do
  # your code goes here
end

その過程で、ベンチマーク出力にカスタム行を追加できることがわかりました。これを使用して、次のように両方の長所 (カスタムの時間測定と最終的な適切な出力) を得ることができます。

require 'benchmark'

measurements = []
10.times { measurements << Benchmark.measure { 1_000_000.times { a = "1" } } }

# measurements.sum or measurements.inject(0){...} does not work, since the
# array contains Benchmark instances, which cannot be coerced into Fixnum's
# Array#sum will work if you are using Rails
sum = measurements.inject(nil) { |sum, t| sum.nil? ? sum = t : sum += t }
avg = sum / measurements.size

# 7 is the width reserved for the description "sum:" and "avg:"
Benchmark.bm(7, "sum:", "avg:") do |b|
  [sum, avg]
end

結果は次のようになります。

             user     system      total        real
sum:     2.700000   0.000000   2.700000 (  2.706234)
avg:     0.270000   0.000000   0.270000 (  0.270623)
于 2011-06-17T05:56:40.930 に答える
2

Process::timesユーザー時間/システム時間を返す関数を使用できます。(壁時計の時刻は報告されません。そのためには別のものが必要になります)。ただし、ビットバージョンまたはOSに依存しているようです。

これは私のシステム(Linux、Ruby 1.8.7)で報告されるものです:

$ irb
irb(main):001:0> t = Process.times
=> #<struct Struct::Tms utime=0.01, stime=0.0, cutime=0.0, cstime=0.0>

ただし、ドキュメントにはこれが示されているため、一部のバージョン/実装には最初の 2 つしかない場合があります。

t = Process.times
[ t.utime, t.stime ]   #=> [0.0, 0.02]

timesLinux での基になる呼び出しについては、を参照してください。

これは、サポートする種類の本当にくだらないラッパーです-:

class SysTimes

    attr_accessor :user, :system

    def initialize
        times = Process.times
        @user = times.utime
        @system = times.stime
    end

    def -(other)
        diff = SysTimes.new
        diff.user = @user - other.user
        diff.system = @system - other.system
        diff
    end
end

あなたのコンテキストでうまく機能させるためのアイデアを提供する必要があります。

于 2011-06-17T05:42:34.750 に答える