我正在使用SimpleXML类构建RSS解析器,我想知道使用DOMDocument类是否会提高解析器的速度。我正在解析一个至少1000行的rss文档,我使用了来自这1000行的几乎所有数据。我正在寻找花费最少时间来完成的方法。
答案 0 :(得分:20)
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文档。您的减速不会在内存使用或解析速度上,而是在您的应用程序逻辑中。
答案 1 :(得分:-1)
好吧,我在DomDocument
和SimpleXML
之间遇到了巨大的性能差异。我有~15 MB的大XML文件,大约有50 000个这样的元素:
...
<ITEM>
<Product>some product code</Product>
<Param>123</Param>
<TextValue>few words</TextValue>
</ITEM>
...
我只需要阅读&#34;这些值并将它们保存在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秒后死亡,超出最大执行时间错误。解析了只有15000件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
之间确实存在巨大的性能差异