日記
XML_Parserとpreg_match (22:09)Edit

また、「はてなCTOの伊藤直也氏が語る「はてな開発の裏側」がネタもと。

「Perlの正規表現はとても優秀で、モジュールと比べても桁違いに早い。(速度という観点から)XMLモジュールよりも現実的なほうを実装している」。

というのを読んで、PEARのXML_ParserベースのAmazon WebサービスのレスポンスXMLパースクラスと、preg_match(_all)を使ったパースクラスを作って、

$amazon =& new パースクラス();
$amazon->setInputString(レスポンスXML);
$amazon->parse();

なんて処理を100回ループして速度を比較してみたら、XML_Parserベースの場合、

real 0m4.423s
user 0m2.970s
sys  0m0.020s

preg_match(_all)を使った場合、

real 0m2.493s
user 0m1.120s
sys  0m0.000s

なんて感じだった。しかもテストコード内で最初パース処理を1000回ループしようとしたら、XML_Parserベースの方はmemory-limit(8Mバイト)に引っかかって途中で落ちやがるし。

ってことで、確かにXMLライブラリを使うよりも、正規表現を使った方が速度的にも上だし、メモリ効率的にも上みたいだな。RSSも同じくって感じなんだろうなー。AmazonとRSSのパースライブラリを一通り正規表現ベースに書き換えるべきなんだろうか。AmazonはともかくRSSは(バージョンが多くて)辛いよなー。

そういや、PHPって明示的にunsetしても(たとえば上記の最終行にunset($amazon);したり)メモリは解放されないみたいだけど、これってどうにかならないのかなー。DB関連のオブジェクトは強制的に解放する関数が用意されているけど、通常の変数領域を強制的に開放する手段はないのか?

Published At2004-12-24 00:00Updated At2004-12-24 00:00