timeコマンドでプログラムの実行時間を知る


作ったスクリプトやプログラムの実行時間を知りたいときに使えるのがtimeコマンドです。timeコマンドの見方と、使い方についてメモを残しておきます。

実行例としてperlとc言語で1から1000000000の総和を計算してみました。

0. 環境

システム バージョン
Mac OS X 10.9.4
perl v5.16.2
clang clang-503.0.40

1. timeコマンドとは

timeコマンドはコマンド・プログラムを引数としてとり、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかった出力するコマンドです。

具体的にsleep 10で試してみましょう。

$ time sleep 10

real    0m10.002s
user    0m0.001s
sys     0m0.002s

timeが出力するreal, user, sysはそれぞれ次のような意味になります。

項目 意味
real プログラムの呼び出しから終了までにかかった実時間(秒)
user プログラム自体の処理時間(秒)(ユーザCPU時間)
sys プログラムを処理するために、OSが処理をした時間(秒)(システム時間)

なのでsleep 10 はプログラム呼び出しから終了までに10.002秒がかかったが、sleep 10 自体の処理には全然CPUが使われていないことがわかります。

(※ここで注意ですが、ネットワークI/Oの待ち時間やディスクI/Oの待ち時間はrealには反映されますが、sysには反映されません。)

2. 総和プログラムで実行時間の比較

ここでは実例としてperlC言語(clang)で、1から1000000000まで総和を求めて出力するプログラムの実行時間をそれぞれ求めます。

2.1 perl

試したコード

cnt.pl
#!/usr/bin/perl
use strict;
use warnings;

my $sum;

foreach my $num (1..1000000000)  
{
    $sum += $num;
}

print $sum;
実行結果
$ time ./cnt.pl 
500000000500000000
real    0m59.037s
user    0m58.997s
sys     0m0.029s

約1分ほどかかっています。

2.2 clang

試したコード

cnt.c
#include <stdio.h>

int main(void){
    long long int sum = 0;
    long int i;

    for(i=1;i<=1000000000;i++){
       sum +=i;
    }
    printf("%lld", sum);

    return 0;

}

$ clang cnt.c -o cnt.out
実行結果
$ time ./cnt.out 
500000000500000000
real    0m2.567s
user    0m2.559s
sys     0m0.006s

約2.6秒で計算が完了しています。