$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

real、user和sys在时间输出中意味着什么?在对我的应用进行基准测试时,哪一项是有意义的?


当前回答

Real显示流程的总周转时间;而User显示用户定义指令的执行时间Sys是执行系统调用的时间!

实时还包括等待时间(I/O等的等待时间)

其他回答

必须提到的是,至少在我的AMD Ryzen CPU上,在多线程程序(或使用-O3编译的单线程程序)中,用户总是比实际用户大。

eg.

real    0m5.815s
user    0m8.213s
sys 0m0.473s

Real显示流程的总周转时间;而User显示用户定义指令的执行时间Sys是执行系统调用的时间!

实时还包括等待时间(I/O等的等待时间)

为了进一步解释公认的答案,我只想提供另一个原因,为什么real≠user+sys。

请记住,real表示实际运行时间,而user和sys值表示CPU执行时间。因此,在多核系统上,用户和/或系统时间(以及它们的总和)实际上可能超过实时。例如,在我为类运行的Java应用程序上,我得到了一组值:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

•真实:从开始到结束运行过程所花费的实际时间,就像是由人用秒表测量的一样

•用户:计算过程中所有CPU花费的累计时间

•sys:所有CPU在系统相关任务(如内存分配)期间所花费的累积时间。

注意,有时user+sys可能大于real,因为多个处理器可以并行工作。

简单地说,我喜欢这样想:

real是运行命令所需的实际时间(就像用秒表计时一样)user和sys是CPU执行命令所需的“工作量”。这项“工作”以时间单位表示。

一般来说:

user是CPU运行命令代码所做的工作量sys是CPU为了支持运行命令而处理“系统开销”类型任务(如分配内存、文件I/O等)所需的工作量

由于这最后两次是计算已完成的“工作”,因此它们不包括线程可能花费的等待时间(例如等待另一个进程或磁盘I/O完成)。

然而,real是实际运行时间的度量,而不是“工作”,因此它确实包括了等待所花费的时间。