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

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

我得到的输出

 system.time(myfunction()) 

是:

  user system elapsed 117.36 5.65 127.86 

“用户”和“系统”是什么措施?

这在?proc.timesystem.time()返回类"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._ 

我曾阅读过关于usersystem时间差异的最清晰的解释,是由William Dunlap在[R-help]上提供的 :

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

虽然?proc.time返回类似的东西,但这个描述对我来说更容易理解。

由于这些都是通用的,从维基百科:

“用户CPU时间”这个术语起初可能有些误导。 要清楚的是,总时间(实际CPU时间)是CPU花费在程序上执行某些操作的时间量与CPU花费在程序上代表内核执行系统调用的时间量的组合。 当一个程序在一个数组中循环时,它正在累积用户的CPU时间。 相反,当一个程序执行一个系统调用,如exec或fork,它正在累积系统CPU时间。

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

这里有一些简单的解释:

已用时间是为expression式向CPU收取的时间。

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

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

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

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

…这些统计数据由(i)调用和终止之间的实际实时时间,(ii)用户CPU时间(时间(2)返回的struct tms中的tms_utimetms_cutime值之和)和iii)系统CPU时间(由times(2)返回的struct tms中的tms_stimetms_cstime值之和)。

所提到的时间variables的定义可以在这里find :

tms_utime用户CPU时间。

tms_stime系统CPU时间。

tms_cutime终止的subprocess的用户CPU时间。

tms_cstime终止subprocess的系统CPU时间。

用户和系统时间之间的差异的说明在达罗齐格的答案和SO的其他地方都有描述:

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