$ 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在时间输出中意味着什么?在对我的应用进行基准测试时,哪一项是有意义的?
当前回答
我想提到一些其他场景,当实时比用户+系统大得多时。我已经创建了一个简单的服务器,它会在很长时间后响应
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获得响应。