Desempenho SimpleXML vs DOMDocument

Eu estou construindo um analisador RSS usando a class SimpleXML e eu queria saber se o uso da class DOMDocument melhoraria a velocidade do analisador. Estou analisando um documento rss que é pelo menos 1000 linhas e uso quase todos os dados dessas 1000 linhas. Estou procurando o método que levará menos tempo para ser concluído.

SimpleXML e DOMDocument usam o mesmo analisador ( libxml2 ), de modo que a diferença de análise entre eles é insignificante.

Isso é fácil de verificar:

 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(); 

Na minha máquina, basicamente não tenho diferença:

 Time to complete 10000 reps: time_load_dd: 17.725028991699 time_load_sxe: 17.416455984116 

O problema real aqui é quais os algoritmos que você está usando e o que você está fazendo com os dados. 1000 linhas não é um documento XML grande. Sua desaceleração não será no uso da memory ou na velocidade de análise, mas na lógica da sua aplicação.

Bem, encontrei uma enorme diferença de desempenho entre DomDocument e SimpleXML . Eu tenho um arquivo XML grande de ~ 15 MB com aproximadamente 50 000 elementos como este:

 ...  some product code 123 few words  ... 

Eu só preciso “ler” esses valores e salvá-los na matriz PHP. No começo, tentei DomDocument

 $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 } 

Esse script morreu após 60 segundos com o tempo de execução máximo excedido . Apenas 15 000 itens de 50k foram analisados.

Então eu reescrevi o código para a versão SimpleXML :

 $xml = new SimpleXMLElement($external_content); foreach($xml->xpath('ITEM') as $item) { $product_code = (string) $item->Product; // ... some other operation } 

Depois de 1 segundo, tudo foi feito.

Não sei como essas funções são implementadas internamente em PHP, mas na minha aplicação (e com minha estrutura XML) há realmente, verdadeiramente ENORME diferença de desempenho entre DomDocument e SimpleXML .