timeよりスゴイ! multitimeを使って実行時間を計測

# multitimeとは

timeコマンドは，コマンドの実行時間を計測するコマンドです．
multitimeコマンドは，コマンドを**繰り返し**発行し，実行時間を計測するコマンドです．

# 実行例

multitimeコマンドに `-n` オプションで実行する回数を渡します．
以下は，multitimeコマンドを使い`sleep 1`を5回実行しています．

```bash
$ multitime -n 5 sleep 1
===> multitime results
1: sleep 1
            Mean        Std.Dev.    Min         Median      Max
real        1.012       0.002       1.010       1.012       1.015       
user        0.001       0.000       0.000       0.001       0.001       
sys         0.002       0.000       0.002       0.002       0.003
```

# インストール方法

Ubuntuの場合はパッケージがあるので，コマンド1つでインストールできます．

```bash
sudo apt install multitime
```

Homebrewもパッケージがあります．

```bash
brew install multitime
```

ビルドしてインストールする場合は以下のリンクを参照してください．

[Laurence Tratt: multitime](https://tratt.net/laurie/src/multitime/)

# 基本的な使い方

`sleep 1`を5回実行した時間を計測し，結果を出力します．．

```bash
$ multitime -n 5 sleep 1
===> multitime results
1: sleep 1
            Mean        Std.Dev.    Min         Median      Max
real        1.010       0.001       1.008       1.010       1.011       
user        0.000       0.000       0.000       0.000       0.000       
sys         0.002       0.000       0.001       0.002       0.002
```

## 平均時間のみ出力

`sleep 1`を5回実行した平均時間だけを出力します．

```bash
$ multitime -p -n 5 sleep 1
real         1.01
user         0.00
sys          0.00
```

## 標準出力を別コマンドに渡す

`sleep 1`を3回実行した平均時間だけを出力します．また，3回それぞれの実行結果を `cowsay` コマンドに標準入力として渡します．これは， `sleep 1; date | cowsay` を3回実行した場合と同様の結果が得られます．

```bash
$ multitime -p -n 3 -o cowsay bash -c "sleep 1; date"
 _____________________________ 
/ 2021年 5月14日 金曜日 \
\ 14時44分55秒 JST         /
 ----------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
 _____________________________ 
/ 2021年 5月14日 金曜日 \
\ 14時44分56秒 JST         /
 ----------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
 _____________________________ 
/ 2021年 5月14日 金曜日 \
\ 14時44分58秒 JST         /
 ----------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
real         1.02
user         0.00
sys          0.01
```

上記は，`-s` オプションを使うことで以下に書き換えられます．`-s` オプションは指定がない場合，ランダムな待ち時間になるため，上記とは厳密には異なります．

```bash
$ multitime -p -n 3 -o cowsay -s 1 date
 _____________________________ 
/ 2021年 5月14日 金曜日 \
\ 14時51分32秒 JST         /
 ----------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
 _____________________________ 
/ 2021年 5月14日 金曜日 \
\ 14時51分33秒 JST         /
 ----------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
 _____________________________ 
/ 2021年 5月14日 金曜日 \
\ 14時51分33秒 JST         /
 ----------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
real         0.00
user         0.00
sys          0.00
```

# 発展した使い方

## SSH先でmultitimeを実行

以下のコマンドでは，遠隔のホストにSSH接続を行い`sleep 10` を10回実行します．その後，`sleep 1`を1回実行してSSHを切断します．事前に遠隔ホストにmultitimeコマンドのインストールが必要です．

```bash
ssh admin@host "(multitime -p -n 10 bash -c \"sleep 10\"; sleep 1;)"
```

## realだけを出力

realだけを計測したい場合は以下のコマンドを実行します．以下では，`sleep 4`を3回実行した結果の `real` を含む行の第2フィールド(数値)だけを絞って出力します．

```bash
$ multitime -p -n 3 sleep 4 2>&1 >/dev/null | grep real | awk '{print $2}'
4.01
```

# 余談

同様のコマンドで[sharkdp/hyperfine](https://github.com/sharkdp/hyperfine)を見つけました．

@kazuho さんのツイートで見つけました．研究のデータ測定で大活躍しました．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">そういえばだけど、linuxでコマンドのベンチマーク取るときに使うコマンドは time(1) ではなく multitime(1) がオススメ。指定回数試行してくれて、平均以外に標準偏差や中央値も教えてくれるよ！ <a href="https://t.co/8X82Ag0opy">https://t.co/8X82Ag0opy</a> <a href="https://t.co/z7H4fSiv4p">pic.twitter.com/z7H4fSiv4p</a></p>&mdash; Kazuho Oku (@kazuho) <a href="https://twitter.com/kazuho/status/1380489437839159299?ref_src=twsrc%5Etfw">April 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>