curl でサッとベンチマークをとる (スライド版)

## 今日話すこと

* curl でサッとベンチマークできるように Go でツールをいくつか書いたよ！

---

## こんなんのや

```
$ ntimes 1000 -p 4 -- curlb https://blog.yuyat.jp/ | percentile
50%:    0.077
66%:    0.082
75%:    0.085
80%:    0.087
90%:    0.223
95%:    0.355
98%:    0.404
99%:    0.677
100%:   3.647
```

---

## こんなのをサッと出す話です

```
$ ntimes 1000 -p 4 -- curlb https://blog.yuyat.jp/ | awk '{ print $1 * 1000 }' | hyst -w 10
  70    7  ##
  80   52  ###################
  90  129  #################################################
 100  110  #########################################
 110  131  ##################################################
 120  103  #######################################
 130  107  ########################################
 140   95  ####################################
 150   66  #########################
 160   67  #########################
 170   44  ################
 180   23  ########
 190   16  ######
 200   10  ###
 210    5  #
 220    1
 230    4  #
 240    0
 250    3  #
 260    4  #
```

---

## 何故 curl を使うか

---

## 専用ツールがあるのになぜ?

* ab
* JMeter
* wrk

---

## 共通言語としての curl

* [WebAPIリクエスト仕様書としてcurlコマンドのご提案](http://qiita.com/Hiraku/items/dfda2f8a5353b0742271)
* [cURL as DSLとは何だったのか。あるいは細かすぎて伝わらないcURL as DSL。](http://blog.shibu.jp/article/115602749.html)
* curl コマンドを生成するツールの存在
  * Google Chrome
  * [mitmproxy](http://qiita.com/laiso/items/2dc52a71e8a2748fcb99)

---

## 開発に集中したいので面倒なセットアップはやりたくない

---

## HTTP リクエストの準備が割と大変

* 単純な GET なら良いが
* Authorization
* User-Agent
* Cookie

---

## curl でレスポンスタイムを取得する

---

## curl でレスポンスタイムを取得する

* 今回は Time to First Byte とします (TTFB)
  * 転送時間は含まない
* まずは curl コマンドを用意する (Chrome とかからコピーする)
* 末尾に `-s -o /dev/null -w '%{time_starttransfer}\n'` を追加

---

## とってみた

```
$ curl https://blog.yuyat.jp/ -s -o /dev/null -w '%{time_starttransfer}\n'
0.123
```

* 単位は秒

---

## これも面倒なので

* ラッパーコマンド `curlb` にしてみた

```sh
#!/bin/sh
curl -s -o /dev/null -w '%{time_starttransfer}\n' "$@"
```

```
$ curlb https://blog.yuyat.jp/
0.272
```

---

## 繰り返し実行してみる

---

## 繰り返し実行してみる

* zsh なら `repeat` コマンドでできる
* が、直列実行なので時間がかかる

```
$ repeat 1000 curlb https://blog.yuyat.jp/
0.077
0.069
0.066
0.066
0.061
0.075
0.070
...
```
---

## 並列実行したい！

---

## とにかくコマンドを並列実行するやつを作った

* https://github.com/yuya-takeyama/ntimes
* Golang 製

```
$ ntimes 1000 -p 4 -- curlb https://blog.yuyat.jp/
0.078
0.081
0.077
0.075
0.082
0.084
0.084
...
```

---

## データをわかりやすく表現したい！

---

## パーセンタイルを出せるやつを作った

* https://github.com/yuya-takeyama/percentile
* Golang 製

```
$ ntimes 1000 -p 4 -- curlb https://blog.yuyat.jp/ | percentile
50%:    0.077
66%:    0.082
75%:    0.085
80%:    0.087
90%:    0.223
95%:    0.355
98%:    0.404
99%:    0.677
100%:   3.647
```

---

## おまけ: ヒストグラムにしたい

* https://github.com/winebarrel/hyst
* 入力は整数にする必要があるので awk でよろしくやっておく

```
$ ntimes 1000 -p 4 -- curlb https://blog.yuyat.jp/ | awk '{ print $1 * 1000 }' | hyst -w 10
  70    7  ##
  80   52  ###################
  90  129  #################################################
 100  110  #########################################
 110  131  ##################################################
 120  103  #######################################
 130  107  ########################################
 140   95  ####################################
 150   66  #########################
 160   67  #########################
 170   44  ################
 180   23  ########
 190   16  ######
 200   10  ###
 210    5  #
 220    1
 230    4  #
 240    0
 250    3  #
 260    4  #
```

---

## まとめ

* `curl` は `-w` でいろんな数値を出せて便利
* `curl` は共通言語として使うのがオススメ
* UNIX 的なツールだと組み合わせて色々できて楽しい