Que mesurent les temps «utilisateur» et «système» dans la sortie R system.time (exp)?

88

J'utilise system.time(expression)pour mesurer le temps d'exécution d'une fonction R.

La sortie que j'obtiens pour l'appel

system.time(myfunction())

est:

    user  system elapsed   
  117.36    5.65  127.86

Que mesurent «l'utilisateur» et le «système»?

cfort
la source
Cette question pourrait utiliser un meilleur titre - comme "Que mesurent les temps" utilisateur "et" système "?". Cela rendrait la question plus claire pour les personnes qui parcourent la liste.
Sharpie

Réponses:

46

Ceci est discuté dans ?proc.time( system.time()renvoie un objet de classe "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.

....et

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
la source
43

L'explication la plus claire que j'ai jamais lue sur la différence entre le temps écoulé useret systemle temps écoulé a été fournie par William Dunlap sur [R-help] :

"User CPU time" donne le temps CPU passé par le processus courant (c'est-à-dire la session R actuelle) et "CPU time system" donne le temps CPU passé par le noyau (le système d'exploitation) au nom du processus courant. Le système d'exploitation est utilisé pour des opérations telles que l'ouverture de fichiers, la saisie ou la sortie, le démarrage d'autres processus et l'examen de l'horloge système: des opérations qui impliquent des ressources que de nombreux processus doivent partager.

Bien que ?proc.timeretourne quelque chose de similaire, cette description était beaucoup plus facile à comprendre pour moi.

Daroczig
la source
22

Voici quelques explications simples:

Le temps écoulé est le temps facturé au (x) processeur (s) pour l'expression.

User Time est l' heure de l'horloge murale. Le temps que vous avez vécu en tant qu'utilisateur.

Habituellement, les deux moments sont relativement proches. Mais ils peuvent varier dans d'autres situations. Par exemple:

  • Si le temps écoulé> le temps utilisateur , cela signifie que le CPU attend que d'autres opérations (peuvent être externes) soient effectuées.
  • Si le temps écoulé <temps utilisateur , cela signifie que votre machine dispose de plusieurs cœurs et peut les utiliser
Fadwa
la source
17

Puisque ceux-ci sont de toute façon génériques, de Wikipedia:

Le terme «temps CPU utilisateur» peut être un peu trompeur au début. Pour être clair, le temps total (temps CPU réel) est la combinaison du temps que le CPU passe à exécuter une action pour un programme et du temps que le CPU passe à exécuter des appels système pour le noyau au nom du programme. Lorsqu'un programme parcourt un tableau, il accumule le temps CPU de l'utilisateur. Inversement, lorsqu'un programme exécute un appel système tel que exec ou fork, il accumule le temps CPU du système.

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

manojlds
la source
2

Comme ces variables de temps sont définies par votre système d'exploitation, vous pouvez récupérer des informations sur la façon dont elles sont calculées en exécutant man timedans votre shell (sous Unix):

... Ces statistiques consistent en (i) le temps réel écoulé entre l'invocation et la terminaison, (ii) le temps CPU de l'utilisateur (la somme des valeurs tms_utimeet tms_cutimedans une structure tms telle que renvoyée par times (2)), et (iii) le temps CPU du système (la somme des valeurs tms_stimeet tms_cstimedans un struct tms comme renvoyé par times (2)).

La définition des variables de temps mentionnées peut être trouvée ici :

tms_utime Temps CPU de l'utilisateur.

tms_stime Temps CPU du système.

tms_cutime Temps CPU utilisateur des processus enfants terminés.

tms_cstime Temps processeur système des processus enfants terminés.

Une clarification des différences entre l'utilisateur et l'heure du système est décrite dans la réponse de Daroczig et ailleurs sur SO :

L' tms_utimeélément est le temps passé à exécuter votre code ou le code dans la bibliothèque C. L' tms_stimeélément est le temps passé dans le noyau à exécuter le code en votre nom.

joelostblom
la source