PHPのXML処理では、SAXよりSimpleXMLの方が速い

PHPでAmazon WebサービスのXMLを処理するライブラリをつくっていた時に気付いたこと。PHP5は、まだリリースされたばかりということもあり、PHP4でも利用可能なSAXインターフェース( xml_parser_create )を使っていたのですが、どうもスクリプトの動作が遅いような気がする。

そこで同じような機能モジュールを、PHP5から標準のSimpleXMLで書き直してパフォーマンスを比較してみました。比較にはJakarta JMeterを使って、サーバのHTTPレスポンスを計測。「スレッド数=1,Ramp-Up期間=1秒,無限ループ」の設定で1分間、60リクエストの平均レスポンスを計ったところ、結果は意外にもSimpleXMLの勝ち。
スクリプト処理には、AmazonのWEBサービス・サーバへのHTTP問い合わせという、時間のかかる処理が含まれているので、単純にXMLのパースの処理時間だけだと、比率ではもっと差が明確になるかもしれません。

  • SAX : 平均 2035 ms
  • SimpleXML : 平均 1842 ms

普通に考えればSAXの方がDOM(SimpleXMLってDOMベースですよね?)より早いのですが、推測するに、PHPのSAXインターフェースは、SAXハンドラー・イベントが起きるたびにPHPスクリプト内のSAXハンドラー関数をCallBackするせいで遅くなるのかも?
これに対してSimpleXMLは、ネイティブレベルでDOMのパースを一度に行ってオブジェクトとして保持するので、結果的にはPHPのSAXより早くなるのかな?ネイティブのSAXパーサーだったら、当然DOMより早くなるのだと思いますが。この考え方、もし間違ってたら、ご指摘ください~。

パフォーマンスのことを考えて、面倒なSAXインターフェースを使って書いていたのですが、意味なかった。小賢しい努力をするよりは、さっさとPHP5にバージョンアップして、新しい機能を使えってことですね。

SimpleXML関数でRSSしてみる(Do You PHP?)
JMeter解説(Techscore)
【連載 】JMeter(高機能/フリーなテストツール)(STACK)