Как Ruby Benchmark рассчитывает общее время процессора в потоке
N.times { Thread.new { puts Benchmark.measure { /* code */ } } }
Показывает ли эталонный тест время, потраченное на выполнение кода в потоке?
Или он показывает общее время, в течение которого интерпретатор ruby работал в каком-либо потоке, в то время как рассматриваемый нами поток жив (даже если он приостановлен из-за того, что работает другой)?
Например, предположим, что поток A выполнялся в течение 1 мс, затем MRI переключается на поток B и остается там в течение 3 мс. Наконец, поток A выполняется снова, и через 1 мс он завершается.
Для потока А тест показывает 2мс или 5мс как общее время? (не в реальном времени)
ОБНОВЛЕНИЕ: Я думаю, что один процесс Sidekiq порождает несколько потоков Ruby. Так что эквивалентно говорить о заданиях Sidekiq вместо потоков. У меня есть некоторые задания на Sidekiq, которые занимают гораздо больше времени, когда Sidekiq выполняет другие тяжелые задания. Это заставляет меня думать, что сравнительный анализ включает время, потраченное на другие рабочие места. Однако, возможно, @mudasobwa прав, и время процессора не включает время, потраченное на другие темы / задания. В этом случае единственное объяснение, которое я могу дать, заключается в том, что системное соединение / пропускная способность является узким местом (и на производительность моих легких заданий влияют другие тяжелые задания, которые потребляют большую пропускную способность).
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>