Was messen die Benutzer- und Systemzeiten in der Ausgabe von R system.time (exp)?

87

Ich verwende system.time(expression), um die Ausführungszeit für eine R-Funktion zu messen.

Die Ausgabe bekomme ich für den Anruf

system.time(myfunction())

ist:

    user  system elapsed   
  117.36    5.65  127.86

Was messen "Benutzer" und "System"?

Komfort
quelle
Diese Frage könnte einen besseren Titel verwenden - z. B. "Was messen die Benutzer- und Systemzeiten?". Dies würde die Frage für die Benutzer der Liste klarer machen.
Sharpie

Antworten:

46

Dies wird in ?proc.time( system.time()gibt ein Objekt der Klasse zurück "proc.time") erläutert :

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.

....und

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
quelle
43

Die klarste Erklärung, die ich je über den Unterschied zwischen userund der systemverstrichenen Zeit gelesen habe, lieferte William Dunlap auf [R-help] :

"Benutzer-CPU-Zeit" gibt die CPU-Zeit an, die der aktuelle Prozess (dh die aktuelle R-Sitzung) verbringt, und "System-CPU-Zeit" gibt die CPU-Zeit an, die der Kernel (das Betriebssystem) für den aktuellen Prozess verbringt. Das Betriebssystem wird beispielsweise zum Öffnen von Dateien, zum Ausführen von Eingaben oder Ausgaben, zum Starten anderer Prozesse und zum Betrachten der Systemuhr verwendet: Vorgänge mit Ressourcen, die viele Prozesse gemeinsam nutzen müssen.

Obwohl ?proc.timeetwas Ähnliches zurückgegeben wird, war diese Beschreibung für mich viel einfacher zu verstehen.

daroczig
quelle
21

Hier einige einfache Erklärungen:

Die verstrichene Zeit ist die Zeit, die der / den CPU (s) für den Ausdruck berechnet wird.

Benutzerzeit ist die Wanduhrzeit. Die Zeit, die Sie als Benutzer erlebt haben.

Normalerweise sind beide Zeiten relativ nahe. In einigen anderen Situationen können sie jedoch variieren. Beispielsweise:

  • Wenn verstrichene Zeit> Benutzerzeit ist , bedeutet dies, dass die CPU darauf wartet, dass einige andere Vorgänge (möglicherweise extern) ausgeführt werden.
  • Wenn die verstrichene Zeit <Benutzerzeit ist , bedeutet dies, dass Ihr Computer über mehrere Kerne verfügt und diese verwenden kann
Fadwa
quelle
17

Da diese sowieso generisch sind, aus Wikipedia:

Der Begriff "Benutzer-CPU-Zeit" kann zunächst etwas irreführend sein. Die Gesamtzeit (reale CPU-Zeit) ist die Kombination aus der Zeit, die die CPU für die Ausführung einer Aktion für ein Programm benötigt, und der Zeit, die die CPU für die Ausführung von Systemaufrufen für den Kernel im Namen des Programms benötigt. Wenn ein Programm ein Array durchläuft, sammelt es die CPU-Zeit des Benutzers. Wenn umgekehrt ein Programm einen Systemaufruf wie exec oder fork ausführt, sammelt es System-CPU-Zeit an.

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

Manojlds
quelle
2

Da diese Zeitvariablen von Ihrem Betriebssystem definiert werden, können Sie Informationen darüber abrufen, wie sie berechnet werden, indem Sie sie man timein Ihrer Shell (unter Unix) ausführen :

... Diese Statistiken bestehen aus (i) der zwischen Aufruf und Beendigung verstrichenen Echtzeit, (ii) der Benutzer-CPU-Zeit (der Summe der tms_utimeund tms_cutime-Werte in einer Struktur, wie sie durch die Zeiten (2) zurückgegeben wird) und (iii) die System-CPU-Zeit (die Summe der tms_stimeund tms_cstime-Werte in einer Struktur, wie von times (2) zurückgegeben).

Die Definition der genannten Zeitvariablen finden Sie hier :

tms_utime Benutzer-CPU-Zeit.

tms_stime System-CPU-Zeit.

tms_cutime Benutzer-CPU-Zeit von beendeten untergeordneten Prozessen.

tms_cstime System-CPU-Zeit von beendeten untergeordneten Prozessen.

Eine Erläuterung der Unterschiede zwischen Benutzer- und Systemzeit ist in der Antwort von daroczig und an anderer Stelle auf SO beschrieben :

Das tms_utimeElement ist die Zeit, die für die Ausführung Ihres Codes oder des Codes in der C-Bibliothek aufgewendet wurde. Das tms_stimeElement ist die Zeit, die der Kernel für die Ausführung von Code in Ihrem Namen benötigt.

joelostblom
quelle