Я создаю синтаксический анализатор 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
.