This answers关于实际、用户和系统计时含义的详细说明。引用:“Real”是指从通话开始到结束的挂钟时间。这个
所有已用时间,包括其他进程使用的时间片,以及
进程被阻塞所花费的时间(例如,如果它正在等待I/O
完成)。
“User”是在用户模式代码(在
内核)在进程中。这只是实际使用的CPU时间
执行流程。其他流程和流程花费的时间
阻塞不计入此数字。
“Sys”是进程内在内核中花费的CPU时间量。
这意味着在
内核,而不是仍在运行的库代码
用户空间。与“user”一样,这是进程使用的唯一CPU时间。
从上面的解释看来,User+Sys time应该等于CPU秒数。相反,它更接近“实时”。奇怪!在
对此有一个合理的解释。”用户时间不包括进程中I/O操作所花费的CPU秒数。它只是测量在内存中花在用户模式代码上的CPU时间。经验法则是:real time = user + sys + I/O time + interpreter startup time + bytecode compilation time
为了验证这一点,我做了一个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 :1(connect)
1 0.248 0.248 0.348 0.348 common_functions.py:1()
1 0.022 0.022 0.075 0.075 __init__.py:2()
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),也就是说,在i/O操作中消耗了1.631CPU秒(主要是_socket.socket和{})。剩下的时间,2.255-2.076,都花在代码的冷启动上。在
希望这是有用的。在
更新:在多核系统中,多个CPU并行工作,情况略有不同。cProfile报告的总CPU秒数是所有CPU单独花费的时间总和。例如:在2核系统中,如果一个CPU工作10秒。同时,另一个CPU工作15秒。报告的CPU总秒数为25秒。虽然实际时间可能只有15秒。因此,在多核系统中,CPU时间可能比实时时间更多。当CPU并行工作时