2016-06-23 19 views
2
N.times { Thread.new { puts Benchmark.measure { /* code */ } } } 

ベンチマークは実際にスレッドでコードを実行するのに費やされた時間を示していますか?Rubyベンチマークがスレッド内のCPU時間の合計を計算する方法

または、別のスレッドが実行されているため一時停止していても、私たちが検討しているスレッドが生きている間に、Rubyインタプリタが実行中の合計時間を表示しますか?

たとえば、スレッドAが1ms実行されていたとし、MRIがスレッドBに切り替えてそこに3ms滞在しているとします。最後にスレッドAが再び実行され、さらに1ms後にスレッドAが終了します。

スレッドAの場合、ベンチマークは合計時間として2msまたは5msを示しますか? (ないリアルタイム)

UPDATE:私は、単一のSidekiqプロセスは、複数のRubyスレッドを生成することを考えます。したがって、スレッドの代わりにSidekiqジョブについて話すのと同じです。 Sidekiqが他の重いジョブを実行しているときに、より多くのSidekiqジョブがあるCPU時間これはベンチマーキングが他の仕事に費やされた時間を含んでいると思うようになります。しかし、おそらく@mudasobwaは正しいですし、CPU時間には他のスレッド/ジョブに費やされた時間は含まれていません。その場合、私が与えることができる唯一の説明は、システムの接続性/帯域幅がボトルネックであることです(そして、私の軽量ジョブのパフォーマンスは、多くの帯域幅を消費する他の重いジョブの影響を受けます)。

答えて

1

私はそれがとても難しいのかどうか疑問に思いますか?

▶ Benchmark.measure { 3.times { |i| 
    Thread.new { puts Benchmark.measure { sleep i }.inspect } 
    } } 
#⇒ #<Benchmark::Tms:0x000000018c2818 @label="", @real=8.5858e-05, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.0, @total=0.0> 
#⇒ #<Benchmark::Tms:0x000000018c3ab0 @cstime=0.0, @cutime=0.0, @label="", @real=0.000118425, @stime=0.0, @total=0.0, @utime=0.0> 
#⇒ #<Benchmark::Tms:0x0000000183cc40 @label="", @real=1.000119122, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.0, @total=0.0> 
#⇒ #<Benchmark::Tms:0x0000000183c7e0 @label="", @real=2.000088775, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.0, @total=0.0> 

2番目の行は明らかに周囲の合計です。ここ

OKは、(最後の合計である)再開されたスレッドを持つ例です。

▶ Benchmark.measure { 3.times { |i| Thread.new { puts Benchmark.measure { (i * 100_000_000).times { 2000 << 2 } }.inspect } } } 
#⇒ #<Benchmark::Tms:0x000000016c6438 @label="", @real=2.377e-06, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.0, @total=0.0> 
#⇒ #<Benchmark::Tms:0x000000016c5420 @label="", @real=9.034328202, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=9.040000000000001, @total=9.040000000000001> 
#⇒ #<Benchmark::Tms:0x000000016c4a98 @label="", @real=13.769757073, @cstime=0.0, @cutime=0.0, @stime=0.010000000000000009, @utime=13.77, @total=13.78> 
#⇒ #<Benchmark::Tms:0x000000016c6bb8 @cstime=0.0, @cutime=0.0, @label="", @real=5.1321e-05, @stime=0.0, @total=0.0, @utime=0.0> 
+0

それはそれほど明確ではありません。スニペットの合計時間は常にゼロであるため、実際にスレッドに費やされた時間だけがカウントされると思います。しかし、私は完全には確信していません:あなたのケースでは、すべてのスレッドが眠っているので、おそらくまた通訳は同じことをやっています。 – collimarco

+0

OK、私は覚醒したスレッドであなたのための別の例をしました。 – mudasobwa

関連する問題