1 プログラムのリソース使用量を測定する

time コマンドは別のプログラムを実行し、その実行中にシステムが収集した、そのプログラムのリソース使用量を表示します。報告する情報と表示形式を選択できます(出力形式の設定を参照)。また、time に情報を画面へ表示させる代わりにファイルへ保存させることもできます(出力のリダイレクトを参照)。

time が報告できるリソースは、大きく時間、メモリ、I/OおよびIPC呼び出しに分類されます。システムによっては、プログラムのリソース使用量に関する情報があまり提供されません。time は取得できない情報をゼロとして報告します(精度を参照)。

time コマンドの形式は次のとおりです。

time [option...] command [arg...]

time は、指定された引数 arg… を渡してプログラム command を実行します。command が終了すると、time は command のリソース使用量を表示します。

次の例では、time を使ってプログラム grep の実行に要した時間やその他のリソースを測定します。

eg$ time grep nobody /etc/aliases
nobody:/dev/null
etc-files:nobody
misc-group:nobody
0.07user 0.50system 0:06.69elapsed 8%CPU (0avgtext+489avgdata 324maxresident)k
46inputs+7outputs (43major+251minor)pagefaults 0swaps

GNU time への提案やバグ報告は bug-time@gnu.org 宛てにメールで送ってください。time のバージョン(「env time --version」で取得できます)、使用したオペレーティングシステムとCコンパイラを含めてください。


1.1 出力形式の設定

time は、実行するコマンドのリソース使用量についてどの情報を表示するかを、書式文字列で決定します。書式文字列の内容の解釈については、書式文字列を参照してください。

以下のコマンドラインオプションで書式文字列を指定できます。コマンドラインで書式が指定されていなくても、環境変数 TIME が設定されていれば、その値が書式文字列として使われます。それ以外の場合は、time に組み込まれた既定の書式が使われます。

%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k
%Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps

書式を設定するコマンドラインオプションは次のとおりです。

-f format
--format=format

format を書式文字列として使います。

-p
--portability

POSIX標準1003.2に適合する、次の書式文字列を使います。

real %e
user %U
sys %S
-v
--verbose

組み込みの詳細書式を使います。プログラムのリソース使用量について取得できる情報を、意味を説明する英語の記述とともに、情報ごとに1行ずつ表示します。


1.2 書式文字列

書式文字列は time の出力内容を制御します。通常のテキストの間にリソース指定子とエスケープを挟んで構成します。

バックスラッシュはエスケープを開始し、出力時には単一の出力文字に変換されます。有効なエスケープを以下に示します。無効なエスケープは、疑問符に続けてバックスラッシュを出力します。

\t

タブ文字

\n

改行

\\

バックスラッシュそのもの

time はリソース使用量を表示した後、必ず改行を出力するため、通常、書式文字列の末尾には改行文字(または「\n」)を付けません。

リソース指定子は、パーセント記号とそれに続く1文字で構成します。無効なリソース指定子は、疑問符に続けてその無効な文字を出力します。パーセント記号そのものを出力するには「%%」を使います。

リソース指定子を以下に示します。これらは tcsh の組み込み time コマンドが認識する指定子を包含します。Unixのすべてのバージョンですべてのリソースが測定されるわけではないため、一部の値はゼロとして報告されることがあります(精度を参照)。


1.2.1 時間リソース

E

プロセスが使用した実経過時間(壁時計時間)。形式は [時:]分:秒です。

e

プロセスが使用した実経過時間(壁時計時間)。単位は秒です。

S

システムがプロセスのためにカーネルモードで使用したCPU時間の合計。単位はCPU秒です。

U

プロセスがユーザーモードで直接使用したCPU時間の合計。単位はCPU秒です。

P

このジョブが得たCPUの割合。ユーザー時間とシステム時間の和を総実行時間で割った値です。


1.2.2 メモリリソース

M

プロセスの生存期間中の最大常駐セットサイズ。単位はキロバイトです。

t

プロセスの平均常駐セットサイズ。単位はキロバイトです。

K

プロセスの平均総メモリ使用量(データ+スタック+テキスト)。単位はキロバイトです。

D

プロセスの非共有データ領域の平均サイズ。単位はキロバイトです。

p

プロセスの非共有スタックの平均サイズ。単位はキロバイトです。

X

プロセスの共有テキストの平均サイズ。単位はキロバイトです。

Z

システムのページサイズ。単位はバイトです。各システム内では一定ですが、システム間では異なります。


1.2.3 I/Oリソース

F

プロセスの実行中に発生したメジャーページフォールト、すなわちI/Oを必要とするページフォールトの回数。ページが実際に主記憶から移動している場合のフォールトです。

R

マイナーページフォールト、すなわち回復可能なページフォールトの回数。これらのページは有効でないためフォールトが発生しますが、まだ他の仮想ページに割り当てられていません。このため、ページ内のデータは依然として有効ですが、システムの管理表を更新する必要があります。

W

プロセスが主記憶からスワップアウトされた回数。

c

プロセスが非自発的にコンテキスト切り替えされた回数(タイムスライスが終了したため)。

w

プログラムが自発的にコンテキスト切り替えされた回数。たとえば、I/O操作の完了を待っている場合です。

I

プロセスによるファイルシステム入力の回数。

O

プロセスによるファイルシステム出力の回数。

r

プロセスが受信したソケットメッセージの数。

s

プロセスが送信したソケットメッセージの数。

k

プロセスへ配信されたシグナルの数。


1.2.4 コマンド情報

C

測定対象コマンドの名前とコマンドライン引数。

x

コマンドの終了ステータス。


1.2.5 終了状態

以下は2文字の指定子です。

%Tt

終了の種類。コマンドの終了のしかたに応じて、「normal」または「signalled」というテキストになります。「normal」は、終了コードがゼロの場合に限らず、任意の終了コードでプログラムが終了したことを意味します。

%Tx

コマンドが正常に終了した場合(シグナルで終了していない場合)の数値の終了コード。「%x」書式指定子と似ていますが、「%x」とは異なり、プログラムがシグナルで終了した場合は空になります。

%Tn

コマンドがシグナルで終了した場合の数値のシグナル番号(たとえば、SIGKILLで終了した場合の「9」)。プログラムが正常に終了した場合(シグナルで終了していない場合)は空になります。

%Ts

コマンドがシグナルで終了した場合のシグナル名(たとえば、SIGKILLで終了した場合の「KILL」)。プログラムが正常に終了した場合(シグナルで終了していない場合)は空になります。

%To

コマンドが正常に終了し(シグナルによる終了でなく)、終了コードがゼロである場合は「ok」というテキスト。それ以外の場合は空になります。


1.3 出力のリダイレクト

既定では、time はリソース使用統計を標準エラー出力へ書き出します。以下のオプションでは、代わりにファイルへ書き出します。実行するプログラムが標準エラー出力へ書き込む場合や、time を対話なしで、またはバックグラウンドで実行する場合に役立ちます。

-o file
--output=file

リソース使用統計を file へ書き出します。既定ではファイルを上書きし、それまでの内容を破棄します。

-a
--append

出力ファイルを上書きする代わりに、リソース使用情報を追記します。このオプションは「-o」または「--output」オプションと併用した場合にのみ有用です。


1.4 例

コマンド「wc /etc/hosts」を実行して、既定の情報を表示します。

eg$ time wc /etc/hosts
      35     111    1134 /etc/hosts
0.00user 0.01system 0:00.04elapsed 25%CPU (0avgtext+0avgdata 0maxresident)k
1inputs+1outputs (0major+0minor)pagefaults 0swaps

コマンド「ls -Fs」を実行して、ユーザー時間、システム時間、壁時計時間だけを表示します。

eg$ time -f "\t%E real,\t%U user,\t%S sys" ls -Fs
total 16
1 account/      1 db/           1 mail/         1 run/
1 backups/      1 emacs/        1 msgs/         1 rwho/
1 crash/        1 games/        1 preserve/     1 spool/
1 cron/         1 log/          1 quotas/       1 tmp/
        0:00.03 real,   0.00 user,      0.01 sys

ファイル .bashrc を編集し、環境変数 TIME から書式文字列を読み取って、time に経過時間とシグナル数をファイル log へ追記させます。

eg$ export TIME="\t%E,\t%k" # If using bash or ksh
eg$ setenv TIME "\t%E,\t%k" # If using csh or tcsh
eg$ time -a -o log emacs .bashrc
eg$ cat log
        0:16.55,        726

コマンド「sleep 4」を実行し、その情報をすべて詳細に表示します。

eg$ time -v sleep 4
        Command being timed: "sleep 4"
        User time (seconds): 0.00
        System time (seconds): 0.05
        Percent of CPU this job got: 1%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.26
        Average shared text size (kbytes): 36
        Average unshared data size (kbytes): 24
        Average stack size (kbytes): 0
        Average total size (kbytes): 60
        Maximum resident set size (kbytes): 32
        Average resident set size (kbytes): 24
        Major (requiring I/O) page faults: 3
        Minor (reclaiming a frame) page faults: 0
        Voluntary context switches: 11
        Involuntary context switches: 0
        Swaps: 0
        File system inputs: 3
        File system outputs: 1
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 1
        Page size (bytes): 4096
        Exit status: 0

1.5 精度

経過時間の収集は、プログラムの実行と不可分な操作として行われません。そのため、特殊な状況(測定対象のプログラムが終了してから time が実行時間を計算するまでの間に、time コマンドが停止したりスワップアウトされたりした場合)には、実際の実行時間よりも大幅に長くなることがあります。

コマンドの実行時間がほぼゼロの場合、一部の値(たとえばCPU使用率)がゼロ(これは誤り)または疑問符として報告されることがあります。

time が表示する情報の大部分は、getrusage システムコールから得られます。数値の精度は getrusage が返す値の精度に依存します。システムによっては、time が報告できるすべてのリソースを測定しているわけではなく、それらのリソースはゼロとして報告されます。大部分またはすべてのリソースを測定するシステムは、4.2BSDまたは4.3BSDを基盤としています。後のBSDリリースは異なるメモリ管理コードを使い、測定するリソースが少なくなっています。

getrusage 呼び出しがないシステムでは、代わりに times システムコールが使われます。これは getrusage よりもはるかに少ない情報しか提供しないため、そのようなシステムでは time が大部分のリソースをゼロとして報告します。

「%I」と「%O」の値は、「実際の」入力と出力だけで、キャッシュ装置が供給するものは含まないと言われています。「%I」と「%O」が報告する「実際の」I/Oの意味は、ワークステーション、とりわけディスクレスのものでは曖昧になることがあります。


1.6 time コマンドの実行

time コマンドの形式は次のとおりです。

time [option...] command [arg...]

time は、指定された引数 arg… を渡してプログラム command を実行します。command が終了すると、time は command のリソース使用量を表示します(既定では標準エラー出力へ)。command が非ゼロのステータスで終了したり、シグナルで終了したりした場合、time は警告メッセージと、終了ステータスまたはシグナル番号を表示します。

time のオプションは、コマンドライン上で command より前に置かなければなりません。command より後にあるものはすべて、command への引数として渡されます。

-o file
--output=file

リソース使用統計を file へ書き出します。

-a
--append

出力ファイルを上書きする代わりに、リソース使用情報を追記します。

-f format
--format=format

format を書式文字列として使います。

--help

time のコマンドラインオプションの要約を表示して終了します。

-p
--portability

POSIX形式を使います。

-v
--verbose

組み込みの詳細書式を使います。

-V
--version

time のバージョン番号を表示して終了します。