awkとcutの文字列切り出し速度を比較してみた

2014-01-15
awk
cut

いや、なんというかawkは超高機能で、複雑な集計処理とかも出来るわけです。
それにも関わらず基本的な使い方は、半角スペース区切りの文字列切り出しだけだったりします。 そうこんな感じ

1
$ cat access_log | awk '{print $3,$5}'

きっとベテランエンジニアは「( ゚д゚ )クワッ!!文字列の切り出しは、cutを使え!」とか言うに違いない。
きっと、今日も明日も僕はディスられるに違いない! でも、本当のところ、速度的にはどうなんだろう?
awkとcutはどっちが早いのか?いっちょ、やってみよう。

実験条件

  1. 10万行のアクセスログ
  2. IPアドレスとURLを抜き出す
  3. 対象のログファイルは、テスト試行回数分の同じファイルを用意して、ファイルがメモリに載ってない状態で揃える。
  4. cutのバージョンは => cut (GNU coreutils) 5.97
  5. awkのバージョンは => GNU Awk 3.1.5

実験コマンド

awk

1
time cat access_log | awk '{print $1,$7}' > /dev/null

cut

1
time cat access_log | cut -d ' ' -f1,7 > /dev/null

※ターミナルへの描画で時間がかかる事を考慮して/dev/nullへリダイレクトした。  

実験結果

コマンド 1回目 2回目 3回目
cut 5.648s 5.293s 8.811s
awk 0.676s 0.364s 0.677s

考察

cutクソ遅ぇ。

と言うわけで、どんなにディスられても、私は今後も文字列切り出しにawkを使います。
しかし、何故にこんなに速度差が出るのだろう。cutのソースコードを写経してみようかな・・・(-_-;)