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

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


当前回答

我想提到一些其他场景,当实时比用户+系统大得多时。我已经创建了一个简单的服务器,它会在很长时间后响应

real 4.784
user 0.01s
sys  0.01s

问题在于,在这种情况下,进程等待的响应既不在用户站点上,也不在系统中。

运行find命令时也会发生类似的情况。在这种情况下,时间主要用于请求和从SSD获得响应。

其他回答

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

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

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

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

eg.

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

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

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

一般来说:

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

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

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

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

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

我想提到一些其他场景,当实时比用户+系统大得多时。我已经创建了一个简单的服务器,它会在很长时间后响应

real 4.784
user 0.01s
sys  0.01s

问题在于,在这种情况下,进程等待的响应既不在用户站点上,也不在系统中。

运行find命令时也会发生类似的情况。在这种情况下,时间主要用于请求和从SSD获得响应。