¿Cuáles son los tiempos de 'usuario' y 'sistema' que miden en la salida de R system.time (exp)?

90

Estoy usando system.time(expression)para medir el tiempo de ejecución de una función R.

La salida que obtengo por la llamada

system.time(myfunction())

es:

    user  system elapsed   
  117.36    5.65  127.86

¿Qué miden el 'usuario' y el 'sistema'?

comodidad
fuente
1
Esta pregunta podría usar un título mejor, como "¿Qué miden los tiempos de 'usuario' y 'sistema'?". Esto aclararía la pregunta a las personas que navegan por la lista.
Sharpie

Respuestas:

48

Esto se discute en ?proc.time( system.time()devuelve un objeto de clase "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.

....y

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._
Gavin Simpson
fuente
45

La explicación más clara que he leído sobre la diferencia entre usery el systemtiempo transcurrido fue proporcionada por William Dunlap en [R-help] :

El "tiempo de CPU del usuario" proporciona el tiempo de CPU empleado por el proceso actual (es decir, la sesión actual de R) y el "tiempo de CPU del sistema" proporciona el tiempo de CPU empleado por el kernel (el sistema operativo) en nombre del proceso actual. El sistema operativo se usa para cosas como abrir archivos, hacer entrada o salida, iniciar otros procesos y mirar el reloj del sistema: operaciones que involucran recursos que muchos procesos deben compartir.

Aunque ?proc.timedevuelve algo similar, esta descripción fue mucho más fácil de entender para mí.

daroczig
fuente
22

Aquí hay algunas explicaciones simples:

El tiempo transcurrido es el tiempo que se carga a las CPU por la expresión.

User Time es la hora del reloj de pared. El tiempo que experimentó usted como usuario.

Por lo general, ambos tiempos son relativamente cercanos. Pero pueden variar en algunas otras situaciones. Por ejemplo:

  • Si el tiempo transcurrido> el tiempo del usuario , esto significa que la CPU está esperando a que se realicen otras operaciones (pueden ser externas).
  • Si el tiempo transcurrido <tiempo del usuario , esto significa que su máquina tiene múltiples núcleos y puede usarlos
Fadwa
fuente
18

Dado que estos son genéricos de todos modos, de Wikipedia:

El término "tiempo de CPU del usuario" puede ser un poco engañoso al principio. Para ser claros, el tiempo total (tiempo real de la CPU) es la combinación de la cantidad de tiempo que la CPU dedica a realizar alguna acción para un programa y la cantidad de tiempo que la CPU dedica a realizar llamadas al sistema para el kernel en nombre del programa. Cuando un programa recorre una matriz, está acumulando tiempo de CPU del usuario. Por el contrario, cuando un programa ejecuta una llamada al sistema, como exec o fork, está acumulando tiempo de CPU del sistema.

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

manojlds
fuente
2

Dado que esas variables de tiempo están definidas por su sistema operativo, puede recuperar información sobre cómo se calculan ejecutando man timeen su shell (en Unix):

... Estas estadísticas consisten en (i) el tiempo real transcurrido entre la invocación y la terminación, (ii) el tiempo de CPU del usuario (la suma de los valores tms_utimey tms_cutimeen una estructura tms según lo devuelto por los tiempos (2)), y (iii) el tiempo de CPU del sistema (la suma de los valores tms_stimey tms_cstimeen una estructura tms como lo devuelve times (2)).

La definición de las variables de tiempo mencionadas se puede encontrar aquí :

tms_utime Tiempo de CPU del usuario.

tms_stime Tiempo de CPU del sistema.

tms_cutime Tiempo de CPU de usuario de procesos secundarios terminados.

tms_cstime Tiempo de CPU del sistema de procesos secundarios terminados.

Una aclaración de las diferencias entre el tiempo del usuario y el sistema se describe en la respuesta de daroczig y en otra parte de SO :

El tms_utimeelemento es la cantidad de tiempo dedicado a ejecutar su código, o el código en la biblioteca C. El tms_stimeelemento es la cantidad de tiempo que pasa en el kernel ejecutando código en su nombre.

joelostblom
fuente