R関数の実行時間を測定するためにsystem.time(expression)
を使用しています。
呼び出しに対して得られる出力
system.time(myfunction())
は:
user system elapsed
117.36 5.65 127.86
「ユーザー」と「システム」は何を測定しますか?
これは_?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._
_
user
とsystem
の経過時間の違いについてこれまで読んだ最も明確な説明は、 [R-help]のウィリアムダンラップ によって提供されました。
「ユーザーCPU時間」は、現在のプロセスに費やされたCPU時間(つまり、現在のRセッション)を与え、「システムCPU時間」は、現在のプロセスに代わってカーネル(オペレーティングシステム)に費やされたCPU時間を与えます。オペレーティングシステムは、ファイルを開いたり、入力または出力を行ったり、他のプロセスを開始したり、システムクロックを調べたりするために使用されます。
?proc.time
は似たようなものを返します。この説明は私にとって理解しやすいものでした。
とにかくこれらは一般的なものなので、ウィキペディアから:
「ユーザーCPU時間」という用語は、最初は少し誤解を招く可能性があります。明らかに、合計時間(実際のCPU時間)は、CPUがプログラムに対して何らかのアクションを実行するのに費やす時間と、CPUがプログラムの代わりにカーネルのシステムコールを実行するのに費やす時間の組み合わせです。プログラムが配列をループすると、ユーザーのCPU時間を累積します。逆に、プログラムがexecやforkなどのシステムコールを実行すると、システムのCPU時間を累積します。
http://en.wikipedia.org/wiki/Time_(Unix)#User_Time_vs_System_Time
以下に簡単な説明を示します。
Elapsed Timeは、式のためにCPUに請求される時間です。
ユーザー時間は実時間です。ユーザーとして経験した時間。
通常、両方の時間は比較的近いです。ただし、他の状況では異なる場合があります。例えば:
これらの時間変数は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
要素は、カーネルがユーザーに代わってコードを実行するのに費やした時間です。