2010年03月10日
行レベルでプログラムの実行速度を調べてわかったこと PHPのsplit()は遅い
あるテキストファイルを処理するプログラムがあるのだけど、ファイルサイズが大きくなるとものすごく処理が遅くなるという、ちょっと困った現象が起こっていました。ファイルサイズが4倍、16倍となれば、処理時間も4倍、16倍となるはずです。しかしこのプログラムは6倍、193倍とリニアな伸び方ではなく、乗数的な伸び方をしているのです。システムダウンはもう目の前です。(笑)
そこで、プログラムをミリ秒単位で計測するデバッグルーチンを入れてみたところ、意外な原因がわかりました。その原因とは、なんと、
$lines = split("\n",$textdata);
おなじみ、split()関数でした。
テキストデータの改行を区切りとして、配列に1行ずつ格納したかったんです。しかもこのプログラムを見ておわかりですね?explode()使えよって感じです。(笑)
正しい使い方
$lines = explode("\n",$textdata);
split() を explode() にしたところ、94,861ms かかっていた処理が 26ms で終わりました。split()遅すぎ〜!!
トラックバックURL
この記事へのコメント
1. Posted by モヤタ 2010年03月15日 12:56
フィードを購読しています。
splitは正規表現を使っています。正規表現は高機能ですが、動作速度は遅いです。
またファイル全体を変数に読み込んで処理していますが、これはファイルサイズが大きくなればなるほどメモリを使用しますので、ファイルサイズが一定以上であれば「1行読み込んで処理」をループするなどの配慮が必要だと思います。
splitは正規表現を使っています。正規表現は高機能ですが、動作速度は遅いです。
またファイル全体を変数に読み込んで処理していますが、これはファイルサイズが大きくなればなるほどメモリを使用しますので、ファイルサイズが一定以上であれば「1行読み込んで処理」をループするなどの配慮が必要だと思います。
2. Posted by Kaz 2010年03月22日 14:56
数KBのテキストデータを処理する目的で作っていたので誤差の範囲で済んでたのですが、サイズが大きい場合は工夫が必要ですね。
それにしてもここまで速度が違うとは思いませんでした。(^^;
それにしてもここまで速度が違うとは思いませんでした。(^^;
