在R system.time(exp)输出中测量的“用户”和“系统”时间是多少?


90

system.time(expression)用来衡量R函数的执行时间。

我得到的电话输出

system.time(myfunction())

是:

    user  system elapsed   
  117.36    5.65  127.86

“用户”和“系统”如何衡量?



1
这个问题可以使用更好的标题,例如“'用户'和'系统'时间在衡量什么?”。这将使浏览列表的人更清楚地问这个问题。
Sharpie

Answers:


48

?proc.timesystem.time()返回class的对象"proc.time")中对此进行了讨论:

Details:

     ‘proc.time’ returns five elements for backwards compatibility, but
     its ‘print’ method prints a named vector of length 3.  The first
     two entries are the total user and system CPU times of the current
     R process and any child processes on which it has waited, and the
     third entry is the ‘real’ elapsed time since the process was
     started.

....和

Value:

....

     The definition of ‘user’ and ‘system’ times is from your OS.
     Typically it is something like

     _The ‘user time’ is the CPU time charged for the execution of user
     instructions of the calling process. The ‘system time’ is the CPU
     time charged for execution by the system on behalf of the calling
     process._

45

我所读过的关于时间usersystem经过时间的最清晰的解释是威廉·邓拉普William Dunlap)在[R-help]上提供的

“用户CPU时间”给出了当前进程(即,当前的R会话)所花费的CPU时间,“系统CPU时间”给出了内核(操作系统)代表当前进程所花费的CPU时间。操作系统用于打开文件,执行输入或输出,启动其他进程以及查看系统时钟等操作:涉及许多进程必须共享的资源的操作。

尽管?proc.time返回的内容类似,但对我来说,这种描述要容易得多。


22

以下是一些简单的解释:

“经过的时间”是为表达式向CPU收取的时间。

用户时间是挂钟时间。您作为用户经历的时间。

通常两个时间都比较接近。但是在其他情况下它们可能会有所不同。例如:

  • 如果经过时间>用户时间,则意味着CPU正在等待其他一些操作(可能是外部操作)完成。
  • 如果经过时间<用户时间,这意味着您的计算机具有多个内核并且可以使用它们

18

由于无论如何都是通用的,因此来自维基百科:

首先,“用户CPU时间”一词可能会引起误解。需要明确的是,总时间(实际CPU时间)是CPU花在对某个程序执行某些操作上的时间量和CPU花在代表该程序对内核执行系统调用上的时间量的总和。当程序循环访问数组时,它正在累积用户CPU时间。相反,当程序执行诸如exec或fork的系统调用时,它正在累积系统CPU时间。

http://en.wikipedia.org/wiki/Time_(Unix)#User_Time_vs_System_Time


2

由于这些时间变量是由操作系统定义的,因此您可以通过man time在shell中执行(在Unix上)来检索有关如何计算它们的信息:

...这些统计信息由(i)调用和终止之间经过的实时时间,(ii)用户CPU时间(由times(2)返回的结构tms中tms_utimeand的tms_cutime值之和)和(iii)系统CPU时间(由times(2)返回的struct tms中tms_stime和的总和tms_cstime)。

提到的时间变量的定义可以在这里找到

tms_utime 用户CPU时间。

tms_stime 系统CPU时间。

tms_cutime 终止子进程的用户CPU时间。

tms_cstime 终止子进程的系统CPU时间。

在daroczig的答案以及SO的其他地方描述了对用户时间和系统时间之间差异的澄清:

tms_utime元素是花费在执行你的代码量,或在C库中的代码。该tms_stime元素是在内核中代表您执行代码所花费的时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.