SimpleXML против производительности DOMDocument - PullRequest
7 голосов
/ 20 февраля 2012

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

Ответы [ 2 ]

20 голосов
/ 21 февраля 2012

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. Ваше замедление будет связано не с использованием памяти или скоростью разбора, а с логикой приложения.

0 голосов
/ 10 марта 2015

Ну, я столкнулся с ОГРОМНОЙ разницей в производительности между DomDocument и SimpleXML. У меня есть ~ 15 МБ большой XML-файл с примерно 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 и SimpleXML.

...