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”?
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”?
Odpowiedzi:
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._
Najbardziej klarowne wyjaśnienie różnicy między czasem user
a system
upł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.time
zwraca coś podobnego, ten opis był dla mnie o wiele łatwiejszy do zrozumienia.
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:
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
Ponieważ te zmienne czasu są definiowane przez system operacyjny, możesz pobrać informacje o tym, jak są obliczane, wykonując man time
w 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_utime
itms_cutime
w struct tms zwróconych przez czasy (2)) oraz (iii) czas procesora systemu (suma wartościtms_stime
itms_cstime
w 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_utime
Elementem jest ilość czasu spędzonego wykonywanie kodu lub kod w bibliotece C.tms_stime
Elementem jest ilość czasu spędzonego w jądrze wykonywania kodu w Twoim imieniu.