▽20001212b
#日記
先日来の perl プログラムは今日が納品. なんだけど,やけに速度が遅くて, こんなん持ってったら怒られてしまうかしら(笑)
具体的にはアクセスログ集計なんだけど, 40万件で 1min,サンプルデータで 200万件だと 5min 弱もかかって, apache のデフォルトタイムアウトに抵触するありさまだ. 客先のマシンはこっちのローカルにあるテストマシンより性能はいいだろうけど, それでも,さすがにいきなり 10倍とかの性能が出るって訳じゃないしね.
って事でプログラムの高速化をしなければならないのだが... まぁログ解析部分にほとんどの時間を使っているのは自明なので, ログを読んでるループ( while( <FILE> ){ ~ } ) の中をすべてコメントアウトして実行, さらにその内側の { ~ } をコメントアウトして実行... うーん,ちょっと頭悪い方式な気がするけど,他に思いつかなかった. { } のスコープごとに時間を計測してくれる perl 内蔵の perf とかあればいいのにね. BenchMark モジュールとかは微妙に使いにくい. 実は大きなカンチガイをしている気がしてならないところではあるが.
で,「 if( /^$hoge/ ){ ~」を「 if( substr( $_, 0, length( $hoge ))){ ~」 に変更したところ,5min 近かった処理は 1.3min にまで改善された. うーん,正規表現のコンパイルってそこまで露骨に重い作業ですカー...