Я создаю парсер RSS с использованием класса SimpleXML, и мне было интересно, будет ли использование класса DOMDocument улучшать скорость анализатора. Я разбираю rss-документ, который составляет не менее 1000 строк, и я использую почти все данные из этих 1000 строк. Я ищу метод, который займет минимум времени.SimpleXML vs DOMDocument performance
ответ
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
и 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
.
Существует огромная разница в использовании xpath и просто получении элементов по их тегу. Судя по тому, как эти скрипты ведут себя, функция xpath фактически не восстанавливает сразу все элементы, предоставляя вам вместо этого объект итератора - который будет значительно легче и быстрее. Это то же самое, что и при загрузке файлов - вы можете сразу загрузить огромный файл или прочитать каждую строку. Поскольку чтение каждой строки не требует загрузки всего в память сразу, она будет работать лучше. – SteveB
Вышеприведенный комментарий верен, его не касается DomDocument vs SimpleXML, его о том, как вы итерации. Вместо этого итерация на DomDocument от getElementsByTagName до DOMXPath делает его так же быстро. Мои тесты в документе размером 120 000 элементов подтверждают это – BobbyTables
- 1. SimpleXML vs DOMDocument с удалением узлов
- 2. 2dsphere vs 2d performance performance
- 3. Преобразование SimpleXML в DOMDocument, а не DOMElement
- 4. if/else vs virtual function: performance performance
- 5. if else vs performance performance в java
- 6. Python 3 urllib Vs performance performance
- 7. xquery vs. xpath performance
- 8. let vs var performance
- 9. Parallelism vs Threading - Performance
- 10. malloc vs mmap performance
- 11. IServerXMLHTTPRequest vs WinHTTP Performance
- 12. strftime performance vs. snprintf
- 13. linq vs ado.net performance
- 14. ржавчина vs c performance
- 15. Selenium vs Jsoup performance
- 16. performance stringbuf vs string
- 17. NSArchiver vs NSKeyedArchiver performance
- 18. Enum.Parse() vs switch performance
- 19. XML vs Array Performance
- 20. Canvas vs. img - performance
- 21. ScrollView vs ListView Performance
- 22. DataContractSerializer vs BinaryFormatter performance
- 23. Performance Image.SCALE_DEFAULT vs Image.SCALE_SMOOTH
- 24. aspx vs html performance
- 25. Get vs Post Performance
- 26. String vs GString Performance
- 27. Akka.net vs Orleans performance
- 28. Python Logging vs performance
- 29. System.Reflection vs Generics - performance
- 30. groovy 'switch' vs. 'performance'
Я бы также добавил, что не только * синтаксический разбор * одинаковый, но наиболее распространенные задачи предлагают примерно такую же производительность. Если ваше приложение медленное с одним, оно будет медленным с другим. –
Спасибо, что это была очень хорошая демонстрация. У меня есть еще один вопрос. Что делать, если я хочу только получить значение одного тега из фида. Какой из них был бы быстрее или разница во времени была бы незначительной, как указано выше? Благодаря! – mhlas7
Вам нужно быть более конкретным, о чем вы сравниваете. (Во-первых, DOM/SXE не имеют «тегов»!) Существует несколько способов получить элемент - путем обхода или XPath, а с XPath существует несколько эквивалентных XPaths, которые будут выполняться по-разному. Почему бы вам не попробовать? Что еще более важно, вы даже * столкнулись * с необходимостью оптимизации? Скорее всего, вам не нужно вообще беспокоиться о скорости и преждевременно выполнять микрооптимизацию. –