Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby benchmark如何计算线程内的总cpu时间_Ruby_Multithreading_Benchmarking_Mri - Fatal编程技术网

Ruby benchmark如何计算线程内的总cpu时间

Ruby benchmark如何计算线程内的总cpu时间,ruby,multithreading,benchmarking,mri,Ruby,Multithreading,Benchmarking,Mri,基准测试是否显示了在线程中执行代码实际花费的时间 或者它是否显示了当我们考虑的线程处于活动状态时,ruby解释器在任何线程上运行的总时间(即使由于另一个线程正在运行而暂停) 例如,假设一个线程a已经执行了1ms,然后MRI切换到线程B并在那里停留3ms。最后,线程A再次执行,并在1毫秒后终止 对于线程A,基准测试显示的总时间是2ms还是5ms?(非实时) 更新:我认为一个Sidekiq进程会产生多个Ruby线程。因此,这相当于谈论Sidekiq作业而不是线程。我有一些Sidekiq作业,当Sid

基准测试是否显示了在线程中执行代码实际花费的时间

或者它是否显示了当我们考虑的线程处于活动状态时,ruby解释器在任何线程上运行的总时间(即使由于另一个线程正在运行而暂停)

例如,假设一个线程a已经执行了1ms,然后MRI切换到线程B并在那里停留3ms。最后,线程A再次执行,并在1毫秒后终止

对于线程A,基准测试显示的总时间是2ms还是5ms?(实时)


更新:我认为一个Sidekiq进程会产生多个Ruby线程。因此,这相当于谈论Sidekiq作业而不是线程。我有一些Sidekiq作业,当Sidekiq执行其他一些繁重的作业时,它们占用了更多的cpu时间。这让我认为基准测试包括了在其他工作上花费的时间。然而,@mudasobwa可能是对的,cpu时间不包括花在其他线程/作业上的时间。在这种情况下,我能给出的唯一解释是系统连接性/带宽是一个瓶颈(我的轻量级作业性能受到其他消耗大量带宽的繁重作业的影响)

我想知道检查是否如此困难

N.times { Thread.new { puts Benchmark.measure { /* code */ } } }
▶ Benchmark.measure{3.times{i}
Thread.new{put Benchmark.measure{sleep i}.inspect}
} }
#⇒ #
#⇒ #
#⇒ #
#⇒ #
第二行显然是周围的总数

好的,下面是一个唤醒线程的示例(最后是总数):


▶ Benchmark.measure{3.times{i|Thread.new{puts Benchmark.measure{(i*100|000|000).times{2000不太清楚。由于代码段中的总时间始终为零,我猜只计算线程上实际花费的时间。但是我不完全相信:在您的情况下,所有线程都处于休眠状态,因此可能解释器也在这样做。
▶ 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>