2012年5月16日水曜日

Powershellのパイプライン処理の時間計測

Awk好き技術者の書いたPowerShell

背景

 先日、WEBサーバのアクセスログの統計解析のスクリプトを書いてみて、書き心地はなかなか悪くなかったのですがパフォーマンスがかなり問題になりました。
とりあえず、続きにパイプライン処理の性能をざっくり把握したいと考えてちょっとやってみました。

お題

 文字列を含んだファイルを開いて、パイプラインで渡す時間を計測する。用意するファイルは100万文字☓1行〜1文字☓100万行の数パターンとする。
$maxSize= 1e6
$file=".\test_" + $pid + ".txt"

function test-performance([int]$length,[int]$repeat)
{
    1..$repeat | %{ "Z" * $length } > $file
    $totalSec = (Measure-Command { cat $file | %{ $_ } > $null}).TotalSeconds
    "{0:###,###}文字×{1:###,###}行:{2:##0.00}秒 -> {3:##0.000}ミリ秒/行" -f $length,$repeat,$totalSec,($totalSec /$repeat * 1000)
    rm $file
}

for ($i = $maxSize ; $i -ge 1 ; $i /= 10){
    test-performance $i ($maxSize / $i)
}

解説

 評価の対象は { cat $file | %{ $_ } > $null}の処理時間。

結果

  • 1,000,000文字×1行:0.01秒 -> 14.701ミリ秒/行
  • 100,000文字×10行:0.02秒 -> 1.731ミリ秒/行
  • 10,000文字×100行:0.03秒 -> 0.306ミリ秒/行
  • 1,000文字×1,000行:0.14秒 -> 0.142ミリ秒/行
  • 100文字×10,000行:1.17秒 -> 0.117ミリ秒/行
  • 10文字×100,000行:11.57秒 -> 0.116ミリ秒/行
  • 1文字×1,000,000行:112.65秒 -> 0.113ミリ秒/行
  • ※環境:Xeon E5506@2.13GHz ☓2プロセッサ、メモリ2GB、WindowsServer2008 SP1 (32bit)

やってみてわかったこと

  • やはり1万件を超えるようなデータの読み込み&パイプライン処理については慎重に考えるべき。
  • (書き捨てのスクリプトのつもりが、遅くてチューニングに時間がかかってしまうなんてことになるかも。)
  • 上記計測の趣旨とは異なりますが、件数の多いテストファイルの作成には読み込み以上に時間がかかった。大量にデータを書き出す処理は更に要注意。
  • 0 件のコメント:

    コメントを投稿