$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
“真实”,“用户”和“系统”在时间输出中意味着什么?
在对我的应用进行基准测试时哪一个有意义?
$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
“真实”,“用户”和“系统”在时间输出中意味着什么?
在对我的应用进行基准测试时哪一个有意义?
Real,User和Sys处理时间统计信息
其中一件事与另一件事情不同。实际是指实际经过的时间; User和Sys指的是使用的CPU时间 只有这个过程。
真实 是挂钟时间 - 从通话开始到结束的时间。这是所有经过的时间,包括其他进程使用的时间片和进程花费的时间(例如,如果它等待I / O完成)。
用户 是用户模式代码(内核之外)花费的CPU时间量 中 这个过程。这只是执行过程时使用的实际CPU时间。流程花费的其他流程和时间不计入此数字。
SYS 是进程内核中花费的CPU时间量。这意味着执行系统调用所花费的CPU时间 在内核中, 而库代码仍然在用户空间中运行。与'user'一样,这只是进程使用的CPU时间。有关内核模式(也称为“管理程序”模式)和系统调用机制的简要说明,请参见下文。
User+Sys
将告诉您进程使用的实际CPU时间。请注意,这是跨所有CPU的,因此如果进程有多个线程(并且此进程在具有多个处理器的计算机上运行),则可能会超过所报告的挂钟时间。 Real
(通常发生)。请注意,在输出中这些数字包括 User
和 Sys
所有子进程(及其后代)的时间以及它们可以被收集的时间,例如通过 wait(2)
要么 waitpid(2)
虽然底层系统调用会分别返回进程及其子进程的统计信息。
报告统计数据的起源 time (1)
报告的统计数据 time
从各种系统调用中收集。 '用户'和'系统'来自 wait (2)
要么 times (2)
,取决于特定的系统。 '真实'是从收集的开始和结束时间计算出来的 gettimeofday (2)
呼叫。根据系统的版本,还可以收集各种其他统计信息,例如上下文切换的数量 time
。
在多处理器计算机上,多线程进程或分叉子进程可能会比CPU总时间小 - 因为不同的线程或进程可能并行运行。此外,报告的时间统计来自不同的来源,因此对于非常短的运行任务记录的时间可能受到舍入误差的影响,如原始海报给出的示例所示。
关于内核与用户模式的简要介绍
在Unix或任何受保护的内存操作系统上, '内核'或'主管' 模式是指a 特权模式 CPU可以运行。某些可能影响安全性或稳定性的特权操作只能在CPU以此模式运行时才能完成。这些操作不适用于应用程序代码。这种行为的一个例子可能是操纵 MMU 获得对另一个进程的地址空间的访问权限。一般, 用户模式 代码不能这样做(有充分的理由),虽然它可以请求 共享内存 来自内核,哪个 可以 由多个进程读取或写入。在这种情况下,通过安全机制从内核显式请求共享内存,并且两个进程必须显式附加到它才能使用它。
特权模式通常称为“内核”模式,因为内核由在此模式下运行的CPU执行。为了切换到内核模式,你必须发出一个特定的指令(通常称为 陷阱)将CPU切换到以内核模式运行 并从跳转表中保存的特定位置运行代码。 出于安全原因,您无法切换到内核模式并执行任意代码 - 陷阱通过无法写入的地址表进行管理,除非CPU以管理员模式运行。使用显式陷阱编号进行陷阱,并在跳转表中查找地址;内核具有有限数量的受控入口点。
C库中的“系统”调用(特别是手册页第2节中描述的那些)具有用户模式组件,这是您实际从C程序调用的组件。在幕后,他们可能会向内核发出一个或多个系统调用来执行特定服务(如I / O),但它们仍然可以在用户模式下运行代码。如果需要,也可以从任何用户空间代码直接向内核模式发出陷阱,尽管您可能需要编写汇编语言片段来为调用正确设置寄存器。可以找到描述Linux内核提供的系统调用的页面以及设置寄存器的约定 这里。
更多关于'sys'的信息
您的代码无法通过用户模式执行某些操作 - 例如分配内存或访问硬件(HDD,网络等)。这些都在内核的监督下,只有它才能做到。你做的一些操作(比如 malloc
要么fread
/fwrite
)将调用这些内核函数,然后将计为'sys'时间。不幸的是,它并不像“每次调用malloc都将计入'sys'时间”那么简单。打电话给 malloc
将自己做一些处理(仍然计入'用户'时间)然后在它可能调用内核中的函数的某个地方(在'sys'时间内计算)。从内核调用返回后,'user'中会有更多时间 malloc
将返回您的代码。至于何时发生切换,以及在内核模式下花费了多少......你不能说。这取决于库的实现。此外,其他看似无辜的功能也可能使用 malloc
等等在后台,然后在'sys'中再次有一些时间。
扩大 接受了答案,我只是想提供另一个原因 real
≠ user
+ sys
。
请记住 real
代表实际经过的时间,而 user
和 sys
值表示CPU执行时间。因此,在多核系统上, user
和/或 sys
时间(以及他们的总和)实际上可以 超过 实时。例如,在我正在为类运行的Java应用程序中,我得到以下值:
real 1m47.363s
user 2m41.318s
sys 0m4.013s
Real表示流程的总周转时间; 用户显示用户定义指令的执行时间 和Sys是时候执行系统调用!
实时包括等待时间(I / O的等待时间等)
• 真实:从开始到结束运行过程所花费的实际时间,就好像是由带有秒表的人测量的
• 用户:计算期间所有CPU花费的累计时间
• SYS:所有CPU在系统相关任务(如内存分配)期间所花费的累计时间。
请注意,有时user + sys可能比real更大,因为 多个处理器可以并行工作。