$ 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