etc - ¿Qué mide el tiempo de ''usuario'' y ''sistema'' en la salida R system.time(exp)?
cuál es el formato del archivo/etc/passwd (5)
Estoy usando system.time(expression)
para medir el tiempo de ejecución para una función R.
La salida que recibo para la llamada
system.time(myfunction())
es:
user system elapsed
117.36 5.65 127.86
¿Qué mide ''usuario'' y ''sistema''?
Aquí hay algunas explicaciones simples:
El tiempo transcurrido es el tiempo cargado a la (s) CPU (s) para la expresión.
El tiempo del usuario es el tiempo del reloj de pared. El tiempo que usted, como usuario, experimentó.
Por lo general, ambos tiempos son relativamente cercanos. Pero pueden variar en algunas otras situaciones. Por ejemplo:
- Si el tiempo transcurrido es> tiempo de usuario , esto significa que la CPU está esperando que se realicen otras operaciones (pueden ser externas).
- Si el tiempo transcurrido <tiempo de usuario , esto significa que su máquina tiene múltiples núcleos y puede usarlos
Como esas variables de tiempo están definidas por su sistema operativo, puede recuperar información sobre cómo se calculan al ejecutar man time
en 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 la CPU del usuario (la suma de los valores
tms_utime
ytms_cutime
en una estructura tms devuelta por los tiempos (2)) y ( iii) el tiempo de CPU del sistema (la suma de los valorestms_stime
ytms_cstime
en una estructura tms como se devuelve por los tiempos (2)).
La definición de las variables de tiempo mencionadas se puede encontrar aquí :
tms_utime
de CPU del usuario.
tms_stime
CPU del sistema.
tms_cutime
de CPU de usuario de procesos secundarios finalizados.
tms_cstime
CPU del sistema de procesos secundarios finalizados.
Una aclaración de las diferencias entre el usuario y la hora del sistema se describe en la respuesta de daroczig y en otros lugares en SO :
El elemento
tms_utime
es la cantidad de tiempo dedicado a la ejecución de su código, o el código en la biblioteca C. El elementotms_stime
es la cantidad de tiempo invertido en el kernel que ejecuta el código en su nombre.
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 que quede claro, el tiempo total (tiempo de CPU real) 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 gasta en realizar llamadas al 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.
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._
La explicación más clara que he leído sobre la diferencia entre el user
y el tiempo transcurrido del system
fue proporcionada por William Dunlap en [R-help] :
El "tiempo de CPU del usuario" da tiempo de CPU al proceso actual (es decir, la sesión R actual) y el "tiempo de CPU del sistema" proporciona el tiempo de CPU gastado por el kernel (el sistema operativo) en nombre del proceso actual. El sistema operativo se utiliza 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.time
devuelve algo similar, esta descripción fue mucho más fácil de entender para mí.