2012-02-20 2 views
7

SimpleXMLクラスを使用してRSSパーサを構築していますが、DOMDocumentクラスを使用するとパーサの速度が向上するのではないかと疑問に思っていました。私は少なくとも1000行のrss文書を解析しており、これらの1000行からのデータのほとんどすべてを使用しています。私は、完了までに最低限の時間を要する方法を探しています。SimpleXMLとDOMDocumentのパフォーマンス

答えて

19

SimpleXMLDOMDocument両方が同じパーサ(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文書ではありません。あなたの減速は、メモリの使用量や解析速度ではなく、アプリケーションロジックにあります。

+0

私はまた、* parsing *が同じであるだけでなく、ほとんどの一般的なタスクが同じ性能を提供していることを付け加えたいと思います。アプリケーションの速度が遅いアプリケーションの場合は、速度が遅くなります。 –

+0

非常に良いデモンストレーションでした。もう一つ質問があります。フィードから1つのタグの値だけを取得する場合はどうすればよいですか。上記のように、どちらの方が速いのでしょうか?ありがとう! – mhlas7

+2

ベンチマーキングの詳細について具体的に説明する必要があります。 DOM/SXEには「タグ」はありません!)トラバーサルまたはXPathによって要素を取得するには複数の方法がありますが、XPathには異なる動作をする複数の同等のXPathがあります。なぜベンチマークしないのですか?さらに重要なことに、最適化の必要性が*発生したことがありますか?ほとんどの場合、速度についてまったく心配する必要はなく、時期尚早にマイクロ最適化が行われます。 –

-1

まあ、DomDocumentSimpleXMLの間に巨大なパフォーマンスの差があります。私はそれらの値を「読み」や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構造体)には実際にはDomDocumentSimpleXMLの間に大きなパフォーマンス差があります。

+5

XPathを使用して、ちょうどそのタグによって要素を得ることに大きな違いがあります。非常に軽く、速くなります - これらのスクリプトは、どのように振る舞うかによって判断すると、XPath関数はなく、実際にイテレータオブジェクトをご提供一度にすべての要素を、回復しません。 これは、ファイルのロードと同じです - あなたは一度に巨大なファイルをロードするか、すべての行を読み取ることができます。すべての行を読み込んでもすべてを一度にメモリに読み込む必要はないため、より良い結果が得られます。 – SteveB

+3

上記のコメントは、正しいそのないのSimpleXML対DOMDOCUMENTについて、そのあなたが繰り返す方法について。代わりに、DomDocumentの反復をgetElementsByTagNameからDOMXPathに変更することで、それを速くすることができます。 〜120.000の要素文書に対する私のテストは、これを確認します – BobbyTables