这很好地回答了真实、用户和系统时间的含义。去引用:
“真实”是挂钟时间 - 从通话开始到结束的时间。这是所有经过的时间,包括其他进程使用的时间片和进程阻塞的时间(例如,如果它正在等待 I/O 完成)。
“用户”是进程内用于用户模式代码(内核外部)的 CPU 时间量。这只是执行进程中使用的实际 CPU 时间。其他进程和进程阻塞的时间不计入此数字。
'Sys' 是进程内在内核中花费的 CPU 时间量。这意味着在内核中执行系统调用所花费的 CPU 时间,而不是仍在用户空间中运行的库代码。像“用户”一样,这只是进程使用的 CPU 时间。
从上面的解释看来,用户+系统时间应该等于 CPU 秒数。相反,它更接近“真实”时间。奇怪的!
对此有一个合理的解释。“用户”时间不包括进程内用于 I/O 操作的 CPU 秒数。它只是测量内存中用户模式代码所花费的 CPU 时间。经验法则是:
实时 = 用户 + 系统 + I/O 时间 + 解释器启动时间 + 字节码编译时间
为了验证这一点,我进行了urllib2.urlopen(urllib2.Request(url))
密集 I/O 调用。结果如下:
100792 function calls (98867 primitive calls) in 2.076 CPU seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
512 0.719 0.001 0.719 0.001 {method 'recv' of '_socket.socket' objects}
1 0.464 0.464 0.473 0.473 {_socket.getaddrinfo}
1 0.352 0.352 0.352 0.352 <string>:1(connect)
1 0.248 0.248 0.348 0.348 common_functions.py:1(<module>)
1 0.022 0.022 0.075 0.075 __init__.py:2(<module>)
1 0.017 0.017 0.030 0.030 urllib.py:1442(getproxies_macosx_sysconf)
330/67 0.012 0.000 0.031 0.000 sre_parse.py:385(_parse)
real 0m2.255s
user 0m0.352s
sys 0m0.093s
这里,2.076-(0.352+0.093),即 1.631 CPU 秒消耗在 I/O 操作中(主要是_socket.socket
和_socket.getaddrinfo
)。其余时间 2.255-2.076 用于代码的冷启动。
希望这很有用。
更新:在多核系统中,多个 CPU 并行工作,情况略有不同。cProfile 报告的总 CPU 秒数是所有 CPU 单独花费的时间总和。例如:在 2 核系统中,如果一个 CPU 工作 10 秒。同时,另一个 CPU 工作 15 秒。报告的总 CPU 秒数将为 25 秒。虽然实际经过的时间可能只有 15 秒。因此,在多核系统中,CPU 时间可能超过实时。由于 CPU并行工作