N.times { Thread.new { puts Benchmark.measure { /* code */ } } }
基准测试是否显示了在线程中执行代码所花费的时间?
或者它是否显示ruby解释器在我们正在考虑的线程处于活动状态时在任何线程上运行的总时间(即使因为另一个线程正在运行而暂停)?
例如,假设线程A已执行1ms,则MRI切换到线程B并在那里停留3ms。最后再次执行线程A,并在另外1ms后终止。
对于线程A,基准测试显示总时间为2ms或5ms? (不实时)
更新:我认为单个Sidekiq进程会生成多个Ruby线程。所以它等同于谈论Sidekiq工作而不是线程。当Sidekiq执行其他一些繁重的工作时,我有一些Sidekiq工作需要更多 cpu time 。这让我认为基准测试包括花在其他工作上的时间。但是@mudasobwa可能是正确的,cpu时间不包括在其他线程/作业上花费的时间。在这种情况下,我能给出的唯一解释是系统连接/带宽是一个瓶颈(我的轻量级作业性能受到消耗大量带宽的其他繁重工作的影响)。
答案 0 :(得分: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>
第二行显然是周围的总数。
好的,这是唤醒线程的示例(最后是总数):
▶ 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>