Производительность SimpleXML и DOMDocument

Я создаю синтаксический анализатор RSS, используя класс SimpleXML, и мне было интересно, будет ли использование класса DOMDocument улучшать скорость анализатора. Я разбираю rss-документ, который составляет не менее 1000 строк, и я использую почти все данные из этих 1000 строк. Я ищу метод, который займет минимум времени.

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 разницей в производительности между DomDocument и SimpleXML . У меня есть большой файл размером ~ 15 МБ с примерно 50 000 элементов:

 ... <ITEM> <Product>some product code</Product> <Param>123</Param> <TextValue>few words</TextValue> </ITEM> ... 

Мне нужно только «прочитать» эти значения и сохранить их в массиве PHP. Сначала я попробовал 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 } 

Этот скрипт умер через 60 секунд с превышением максимального времени выполнения . Было проанализировано только 15 000 наименований 50k.

Поэтому я переписал код на версию SimpleXML :

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

Через 1 секунду все было сделано.

Я не знаю, как эти функции внутренне реализованы в PHP, но в моем приложении (и с моей структурой XML) действительно существует ДЕЙСТВИТЕЛЬНО DomDocument разница в производительности между DomDocument и SimpleXML .