$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
real、user和sys在时间输出中意味着什么?在对我的应用进行基准测试时,哪一项是有意义的?
$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
real、user和sys在时间输出中意味着什么?在对我的应用进行基准测试时,哪一项是有意义的?
当前回答
必须提到的是,至少在我的AMD Ryzen CPU上,在多线程程序(或使用-O3编译的单线程程序)中,用户总是比实际用户大。
eg.
real 0m5.815s
user 0m8.213s
sys 0m0.473s
其他回答
我想提到一些其他场景,当实时比用户+系统大得多时。我已经创建了一个简单的服务器,它会在很长时间后响应
real 4.784
user 0.01s
sys 0.01s
问题在于,在这种情况下,进程等待的响应既不在用户站点上,也不在系统中。
运行find命令时也会发生类似的情况。在这种情况下,时间主要用于请求和从SSD获得响应。
必须提到的是,至少在我的AMD Ryzen CPU上,在多线程程序(或使用-O3编译的单线程程序)中,用户总是比实际用户大。
eg.
real 0m5.815s
user 0m8.213s
sys 0m0.473s
•真实:从开始到结束运行过程所花费的实际时间,就像是由人用秒表测量的一样
•用户:计算过程中所有CPU花费的累计时间
•sys:所有CPU在系统相关任务(如内存分配)期间所花费的累积时间。
注意,有时user+sys可能大于real,因为多个处理器可以并行工作。
Real显示流程的总周转时间;而User显示用户定义指令的执行时间Sys是执行系统调用的时间!
实时还包括等待时间(I/O等的等待时间)
为了进一步解释公认的答案,我只想提供另一个原因,为什么real≠user+sys。
请记住,real表示实际运行时间,而user和sys值表示CPU执行时间。因此,在多核系统上,用户和/或系统时间(以及它们的总和)实际上可能超过实时。例如,在我为类运行的Java应用程序上,我得到了一组值:
real 1m47.363s
user 2m41.318s
sys 0m4.013s