SimpleXMLクラスを使用してRSSパーサを構築していますが、DOMDocumentクラスを使用するとパーサの速度が向上するのではないかと疑問に思っていました。私は少なくとも1000行のrss文書を解析しており、これらの1000行からのデータのほとんどすべてを使用しています。私は、完了までに最低限の時間を要する方法を探しています。SimpleXMLとDOMDocumentのパフォーマンス
答えて
SimpleXML
とDOMDocument
両方が同じパーサ(libxml2
)を使用するので、それらの間解析差はごくわずかです。
これは検証するのは簡単です:私のマシン上で
function time_load_dd($xml, $reps) {
// discard first run to prime caches
for ($i=0; $i < 5; ++$i) {
$dom = new DOMDocument();
$dom->loadXML($xml);
}
$start = microtime(true);
for ($i=0; $i < $reps; ++$i) {
$dom = new DOMDocument();
$dom->loadXML($xml);
}
$stop = microtime(true) - $start;
return $stop;
}
function time_load_sxe($xml, $reps) {
for ($i=0; $i < 5; ++$i) {
$sxe = simplexml_load_string($xml);
}
$start = microtime(true);
for ($i=0; $i < $reps; ++$i) {
$sxe = simplexml_load_string($xml);
}
$stop = microtime(true) - $start;
return $stop;
}
function main() {
// This is a 1800-line atom feed of some complexity.
$url = 'http://feeds.feedburner.com/reason/AllArticles';
$xml = file_get_contents($url);
$reps = 10000;
$methods = array('time_load_dd','time_load_sxe');
echo "Time to complete $reps reps:\n";
foreach ($methods as $method) {
echo $method,": ",$method($xml,$reps), "\n";
}
}
main();
私は基本的には何の違いを取得していない:
Time to complete 10000 reps:
time_load_dd: 17.725028991699
time_load_sxe: 17.416455984116
ここでの本当の問題は、使用しているとあなたが何をしているアルゴリズムものですデータ。 1000行は大きなXML文書ではありません。あなたの減速は、メモリの使用量や解析速度ではなく、アプリケーションロジックにあります。
まあ、DomDocument
とSimpleXML
の間に巨大なパフォーマンスの差があります。私はそれらの値を「読み」やPHPの配列に保存する必要が
...
<ITEM>
<Product>some product code</Product>
<Param>123</Param>
<TextValue>few words</TextValue>
</ITEM>
...
:私は〜15メガバイトこのような約50 000の要素を持つ大きなXMLファイルを持っています。最初に私は最大実行時間と60秒エラーを超えた後、そのスクリプトが死亡した
$dom = new DOMDocument();
$dom->loadXML($external_content);
$root = $dom->documentElement;
$xml_param_values = $root->getElementsByTagName('ITEM');
foreach ($xml_param_values as $item) {
$product_code = $item->getElementsByTagName('Product')->item(0)->textContent;
// ... some other operation
}
... DomDocument
を試してみました。 50,000の15 000項目のみが解析されました。 すべてが行われていた1秒後
$xml = new SimpleXMLElement($external_content);
foreach($xml->xpath('ITEM') as $item) {
$product_code = (string) $item->Product;
// ... some other operation
}
:
は、だから私はSimpleXML
バージョンにコードを書き直しました。
これらの関数がPHPで内部的にどのように実装されているのかわかりませんが、アプリケーション(XML構造体)には実際にはDomDocument
とSimpleXML
の間に大きなパフォーマンス差があります。
XPathを使用して、ちょうどそのタグによって要素を得ることに大きな違いがあります。非常に軽く、速くなります - これらのスクリプトは、どのように振る舞うかによって判断すると、XPath関数はなく、実際にイテレータオブジェクトをご提供一度にすべての要素を、回復しません。 これは、ファイルのロードと同じです - あなたは一度に巨大なファイルをロードするか、すべての行を読み取ることができます。すべての行を読み込んでもすべてを一度にメモリに読み込む必要はないため、より良い結果が得られます。 – SteveB
上記のコメントは、正しいそのないのSimpleXML対DOMDOCUMENTについて、そのあなたが繰り返す方法について。代わりに、DomDocumentの反復をgetElementsByTagNameからDOMXPathに変更することで、それを速くすることができます。 〜120.000の要素文書に対する私のテストは、これを確認します – BobbyTables
- 1. ノードを削除したSimpleXMLとDOMDocumentとの比較
- 2. パフォーマンスの再利用のDOMDocumentの影響か、新しい
- 3. のDOMDocumentとUL tages
- 4. DOMDOCUMENTとHTMLエンティティ
- 5. AJAXとSimpleXMLを
- 6. SimpleXMLとPHP(XPATH)
- 7. SimpleXMLとforeach
- 8. SimpleXML XpathクエリとtransformToXML
- 9. PHPとSimpleXMLのエスケープ文字
- 10. Domdocumentのエンコーディング
- 11. PHP - のDOMDocument
- 12. のSimpleXMLのXpath
- 13. xmlタグSimpleXMLとDOM文書
- 14. SimpleXMLと名前空間
- 15. PHPとJavaScript/Ajaxのキャッシング - JSONとSimpleXMLを
- 16. SimpleXMLにSimpleXMLノードを追加する
- 17. PHPのSimpleXML:
- 18. SimpleXMLのアクセスデータ
- 19. のSimpleXMLループエントリ
- 20. のSimpleXMLデシリアライザ
- 21. SimpleXMLの問題
- 22. SimpleXMLの読書?
- 23. PHPのSimpleXMLオブジェクトキャッシング
- 24. simplexmlのネスト
- 25. SimpleXMLユーザエージェント
- 26. simpleXMLスクリプト
- 27. PHPのDOMDocumentは、Tag
- 28. PHPのDOMDocument loadHTMLエラー
- 29. PHPのDOMDOCUMENT変数
- 30. PHPのDOMDocumentも、要素spanタグと
私はまた、* parsing *が同じであるだけでなく、ほとんどの一般的なタスクが同じ性能を提供していることを付け加えたいと思います。アプリケーションの速度が遅いアプリケーションの場合は、速度が遅くなります。 –
非常に良いデモンストレーションでした。もう一つ質問があります。フィードから1つのタグの値だけを取得する場合はどうすればよいですか。上記のように、どちらの方が速いのでしょうか?ありがとう! – mhlas7
ベンチマーキングの詳細について具体的に説明する必要があります。 DOM/SXEには「タグ」はありません!)トラバーサルまたはXPathによって要素を取得するには複数の方法がありますが、XPathには異なる動作をする複数の同等のXPathがあります。なぜベンチマークしないのですか?さらに重要なことに、最適化の必要性が*発生したことがありますか?ほとんどの場合、速度についてまったく心配する必要はなく、時期尚早にマイクロ最適化が行われます。 –