Ruby基准测试如何在线程中计算总CPU时间

3
N.times { Thread.new { puts Benchmark.measure { /* code */ } } }

基准测试显示的是线程中实际执行代码所花费的时间,还是它显示了 Ruby 解释器在任何线程上运行的总时间,而我们考虑的线程仍然存在(即使它因为另一个线程正在运行而暂停)?
例如,假设线程 A 已经执行了 1 毫秒,然后 MRI 切换到线程 B 并保持了 3 毫秒。最后,线程 A 再次执行,在另外 1 毫秒后终止。
对于线程 A,基准测试显示的是 2 毫秒还是 5 毫秒作为总时间?(不是实时时间)
更新:我认为单个 Sidekiq 进程会生成多个 Ruby 线程。因此,讨论 Sidekiq 作业而不是线程是等效的。当 Sidekiq 执行一些其他重型作业时,我有一些需要更多 CPU 时间的 Sidekiq 作业。这让我认为基准测试包括了花费在其他作业上的时间。但是,也许 @mudasobwa 是正确的,CPU 时间不包括花费在其他线程/作业上的时间。在这种情况下,我唯一能给出的解释是系统连接/带宽是瓶颈(我的轻量级作业性能受到消耗大量带宽的其他重型作业的影响)。
1个回答

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>

这并不是很清楚。由于你的代码片段中总时间始终为零,我猜测只有实际在线程上花费的时间才会被计算。然而我并不完全相信:在你的情况下,所有线程都在睡眠,因此解释器也可能在做同样的事情。 - collimarco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接