2012-02-20 3 views
7

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

ответ

19

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

Я бы также добавил, что не только * синтаксический разбор * одинаковый, но наиболее распространенные задачи предлагают примерно такую ​​же производительность. Если ваше приложение медленное с одним, оно будет медленным с другим. –

+0

Спасибо, что это была очень хорошая демонстрация. У меня есть еще один вопрос. Что делать, если я хочу только получить значение одного тега из фида. Какой из них был бы быстрее или разница во времени была бы незначительной, как указано выше? Благодаря! – mhlas7

+2

Вам нужно быть более конкретным, о чем вы сравниваете. (Во-первых, DOM/SXE не имеют «тегов»!) Существует несколько способов получить элемент - путем обхода или XPath, а с XPath существует несколько эквивалентных XPaths, которые будут выполняться по-разному. Почему бы вам не попробовать? Что еще более важно, вы даже * столкнулись * с необходимостью оптимизации? Скорее всего, вам не нужно вообще беспокоиться о скорости и преждевременно выполнять микрооптимизацию. –

-1

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

+5

Существует огромная разница в использовании xpath и просто получении элементов по их тегу. Судя по тому, как эти скрипты ведут себя, функция xpath фактически не восстанавливает сразу все элементы, предоставляя вам вместо этого объект итератора - который будет значительно легче и быстрее. Это то же самое, что и при загрузке файлов - вы можете сразу загрузить огромный файл или прочитать каждую строку. Поскольку чтение каждой строки не требует загрузки всего в память сразу, она будет работать лучше. – SteveB

+3

Вышеприведенный комментарий верен, его не касается DomDocument vs SimpleXML, его о том, как вы итерации. Вместо этого итерация на DomDocument от getElementsByTagName до DOMXPath делает его так же быстро. Мои тесты в документе размером 120 000 элементов подтверждают это – BobbyTables