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)
0 件のコメント:
コメントを投稿