Jakie są mierzone czasy „użytkownika” i „systemu” w danych wyjściowych R system.time (exp)?

90

Używam system.time(expression)do mierzenia czasu wykonywania funkcji R.

Wyjście, które otrzymuję na wezwanie

system.time(myfunction())

jest:

    user  system elapsed   
  117.36    5.65  127.86

Co mierzy „użytkownik” i „system”?

komfort
źródło
1
W przypadku tego pytania można by użyć lepszego tytułu - na przykład „Jaki jest pomiar czasu użytkownika i systemu?”. Dzięki temu pytanie będzie jaśniejsze dla osób przeglądających listę.
Sharpie

Odpowiedzi:

48

Jest to omówione w ?proc.time( system.time()zwraca obiekt klasy "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.

....i

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
źródło
45

Najbardziej klarowne wyjaśnienie różnicy między czasem usera systemupływającym czasem, jakie kiedykolwiek czytałem, zostało dostarczone przez Williama Dunlapa w [R-help] :

„Czas procesora użytkownika” podaje czas procesora spędzony przez bieżący proces (tj. Bieżącą sesję R), a „czas procesora systemu” podaje czas procesora spędzony przez jądro (system operacyjny) w imieniu bieżącego procesu. System operacyjny jest używany do takich rzeczy, jak otwieranie plików, wykonywanie operacji wejścia lub wyjścia, uruchamianie innych procesów i patrzenie na zegar systemowy: operacje, które obejmują zasoby, które musi współdzielić wiele procesów.

Chociaż ?proc.timezwraca coś podobnego, ten opis był dla mnie o wiele łatwiejszy do zrozumienia.

daroczig
źródło
22

Oto kilka prostych wyjaśnień:

Czas, który upłynął, to czas obciążony procesorem (procesorami) za wyrażenie.

Czas użytkownika to czas zegara ściennego. Czas, którego doświadczyłeś jako użytkownik.

Zwykle oba czasy są stosunkowo bliskie. Ale mogą się różnić w innych sytuacjach. Na przykład:

  • Jeśli upłynął czas> czas użytkownika , oznacza to, że procesor czeka na wykonanie innych operacji (mogą być zewnętrzne).
  • Jeśli upłynął czas <czas użytkownika , oznacza to, że twoja maszyna ma wiele rdzeni i może z nich korzystać
Fadwa
źródło
18

Ponieważ i tak są one ogólne, z Wikipedii:

Termin „czas procesora użytkownika” może na początku wprowadzać w błąd. Aby było jasne, całkowity czas (rzeczywisty czas procesora) jest połączeniem ilości czasu, jaki procesor poświęca na wykonanie jakiejś czynności dla programu i ilości czasu, jaki procesor spędza na wykonywaniu wywołań systemowych dla jądra w imieniu programu. Gdy program przechodzi w pętlę przez tablicę, gromadzi czas procesora użytkownika. I odwrotnie, gdy program wykonuje wywołanie systemowe, takie jak exec lub fork, gromadzi czas procesora systemu.

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

manojlds
źródło
2

Ponieważ te zmienne czasu są definiowane przez system operacyjny, możesz pobrać informacje o tym, jak są obliczane, wykonując man timew powłoce (w systemie Unix):

... Statystyki te składają się z (i) czasu rzeczywistego, który upłynął między wywołaniem a zakończeniem, (ii) czasu procesora użytkownika (suma wartości tms_utimei tms_cutimew struct tms zwróconych przez czasy (2)) oraz (iii) czas procesora systemu (suma wartości tms_stimei tms_cstimew struct tms, zwracana przez times (2)).

Definicję wspomnianych zmiennych czasowych można znaleźć tutaj :

tms_utime Czas procesora użytkownika.

tms_stime Czas procesora systemu.

tms_cutime Czas procesora użytkownika zakończonych procesów potomnych.

tms_cstime Czas procesora systemu zakończonych procesów potomnych.

Wyjaśnienie różnic między czasem użytkownika a czasem systemowym jest opisane w odpowiedzi darocziga oraz w innym miejscu na SO :

tms_utimeElementem jest ilość czasu spędzonego wykonywanie kodu lub kod w bibliotece C. tms_stimeElementem jest ilość czasu spędzonego w jądrze wykonywania kodu w Twoim imieniu.

joelostblom
źródło