关于ruby:为什么实时超过用户+系统+总数?

Why is real time more than user+system+total?

我做了一个基准测试做随机事情,看看这些事情花了多少时间:

1
2
3
4
                              user     system      total        real
joining an array of strings  0.040000   0.010000   0.050000 (  0.046636)
string interpolation         0.020000   0.000000   0.020000 (  0.023903)
just timing                  0.000000   0.000000   0.000000 (  0.004334)

我想实时时间可能小于总时间,因为我有一个多核处理器,但在最后一种情况下,只有实时报告其他人为0.我不明白这是怎么回事。

如果它是相关的,这些是我的基准测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require 'benchmark'

iterations = 10_000

Benchmark.bm do |bm|
  bm.report('joining an array of strings') do
    iterations.times do
      ["The","Current","Time","Is",Time.now].join("")
    end
  end

  bm.report('string interpolation') do
    iterations.times do
     "The current time is #{Time.now}"
    end
  end

  bm.report('just timing') do
    iterations.times do
      Time.now
    end
  end

end

编辑:所以我将iterations提升到iterations = 1_000_000,这些是新的结果:

1
2
3
4
                               user     system      total        real
joining an array of strings  3.640000   0.000000   3.640000 (  3.644826)
string interpolation         2.390000   0.000000   2.390000 (  2.393069)
just timing                  0.390000   0.000000   0.390000 (  0.392369)

实际时间似乎仍然超过总时间,即使最后一次测试所用的时间低于分辨率,我仍然没有得到,然后实时也应该为0,而事实并非如此。


进程可以处于阻塞等待状态,主要是在等待IO时。 在这段时间内,进程不在CPU上,因此不计算CPU时间。

总系统和系统+用户之间差异较大的另一个原因是系统具有如此高的负载,进程非常频繁地上下CPU。