web-dev-qa-db-ja.com

R system.time(exp)出力で測定される「ユーザー」および「システム」時間とは何ですか?

R関数の実行時間を測定するためにsystem.time(expression)を使用しています。

呼び出しに対して得られる出力

system.time(myfunction())

は:

    user  system elapsed   
  117.36    5.65  127.86

「ユーザー」と「システム」は何を測定しますか?

83
cfort

これは_?proc.time_(system.time()がクラス_"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.
_

....そして

_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._
_
43
Gavin Simpson

usersystemの経過時間の違いについてこれまで読んだ最も明確な説明は、 [R-help]のウィリアムダンラップ によって提供されました。

「ユーザーCPU時間」は、現在のプロセスに費やされたCPU時間(つまり、現在のRセッション)を与え、「システムCPU時間」は、現在のプロセスに代わってカーネル(オペレーティングシステム)に費やされたCPU時間を与えます。オペレーティングシステムは、ファイルを開いたり、入力または出力を行ったり、他のプロセスを開始したり、システムクロックを調べたりするために使用されます。

?proc.timeは似たようなものを返します。この説明は私にとって理解しやすいものでした。

39
daroczig

とにかくこれらは一般的なものなので、ウィキペディアから:

「ユーザーCPU時間」という用語は、最初は少し誤解を招く可能性があります。明らかに、合計時間(実際のCPU時間)は、CPUがプログラムに対して何らかのアクションを実行するのに費やす時間と、CPUがプログラムの代わりにカーネルのシステムコールを実行するのに費やす時間の組み合わせです。プログラムが配列をループすると、ユーザーのCPU時間を累積します。逆に、プログラムがexecやforkなどのシステムコールを実行すると、システムのCPU時間を累積します。

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

17
manojlds

以下に簡単な説明を示します。

Elapsed Timeは、式のためにCPUに請求される時間です。

ユーザー時間は実時間です。ユーザーとして経験した時間。

通常、両方の時間は比較的近いです。ただし、他の状況では異なる場合があります。例えば:

  • 経過時間>ユーザー時間の場合、これはCPUが他の操作(外部の場合もある)の実行を待機していることを意味します。
  • 経過時間<ユーザー時間の場合、これはマシンに複数のコアがあり、それらを使用できることを意味します
14
Misaki

これらの時間変数はOSによって定義されているため、シェル(Unix)でman timeを実行することにより、それらの計算方法に関する情報を取得できます。

...これらの統計は、(i)呼び出しから終了までの経過したリアルタイム、(ii)によって返されるstruct tmsのtms_utimeおよびtms_cutime値の合計times(2))、および(iii)システムCPU時間(times(2)によって返されるstruct tmsのtms_stimeおよびtms_cstime値の合計)。

上記の時間変数の定義は こちらにあります になります。

tms_utimeユーザーCPU時間。

tms_stimeシステムCPU時間。

tms_cutime終了した子プロセスのユーザーCPU時間。

tms_cstime終了した子プロセスのシステムCPU時間。

ユーザー時間とシステム時間の違いの明確化は、daroczigの答えと SOのその他の場所 で説明されています。

tms_utime要素は、コードまたはCライブラリ内のコードの実行に費やされた時間です。 tms_stime要素は、カーネルがユーザーに代わってコードを実行するのに費やした時間です。

2
joelostblom