/usr/bin/timeを知った

shellscript


UNIXコマンドにソフトウェアの実行時間を測定するtime(1)コマンドがありますが、 最近timeコマンドはシェル内臓の簡易版であることを知りました。 で、何を使うかというと、システムコマンドの/usr/bin/time

何が違うかというと情報量が違います。 システムコマンドの方には-p--verboseのオプションがあり、 -pオプションではreal(実時間)、user(カーネル関数以外でかかったCPU時間)、 sys(カーネル関数にかかった時間)がわかるらしいです。 --verboseだとめっちゃわかります。

手前の書きなぐりスニペットからニュートン法のプログラムを使いまして、 timeコマンドの実行例を示したいと思います。

#!/usr/bin/env python3
# coding: utf-8

def newton_sqrt(n, x=1.0, err=0.00001):
    while True:
        res = x - (x**2 - n) / (x*2)
        if abs(res - x) < err:
            return res
        x = res

if __name__ == "__main__":
    print(newton_sqrt(5))
$ time python3 mymath.py
2.236067977499978
python3 mymath.py  0.03s user 0.01s system 90% cpu 0.041 total

ちょっと見づらいです。

$ /usr/bin/time python3 mymath.py
2.236067977499978
        0.03 real         0.02 user         0.00 sys

どうやらBSDの/usr/bin/timeはオプションなしでも3種わかるみたいです。

$ /usr/bin/time -p python3 mymath.py
2.236067977499978
real         0.03
user         0.02
sys          0.00
$ /usr/bin/time -l python3 mymath.py
2.236067977499978
        0.04 real         0.03 user         0.00 sys
   6750208  maximum resident set size
         0  average shared memory size
         0  average unshared data size
         0  average unshared stack size
      2115  page reclaims
         0  page faults
         0  swaps
         0  block input operations
         0  block output operations
         0  messages sent
         0  messages received
         0  signals received
         0  voluntary context switches
        72  involuntary context switches

man読む限りだとBSDでは(OSXだけど)-lオプションのようです。 longオプションですかね。

とりあえずこのように走らせたユーティリティのリソースの詳細情報がわかります。

Linuxの/usr/bin/timeコマンドは-oオプションで出力できるらしいです。 複数回行って整合性をとることもできるものと思いますが、 そこまでのことをすることはないんじゃないかなと思います。 他ソフトから管理してプロファイルするときに使うかな?