Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SimpleXML与DOMDocument性能_Php_Performance_Rss_Simplexml_Domdocument - Fatal编程技术网

Php SimpleXML与DOMDocument性能

Php SimpleXML与DOMDocument性能,php,performance,rss,simplexml,domdocument,Php,Performance,Rss,Simplexml,Domdocument,我正在使用SimpleXML类构建RSS解析器,我想知道使用DOMDocument类是否会提高解析器的速度。我正在解析一个至少有1000行的rss文档,我使用了这1000行中的几乎所有数据。我正在寻找花费最少时间来完成的方法。SimpleXML和DOMDocument都使用相同的解析器(libxml2),因此它们之间的解析差异可以忽略不计 这很容易验证: function time_load_dd($xml, $reps) { // discard first run to prime

我正在使用SimpleXML类构建RSS解析器,我想知道使用DOMDocument类是否会提高解析器的速度。我正在解析一个至少有1000行的rss文档,我使用了这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();

这里真正的问题是您正在使用什么算法以及您正在对数据做什么。1000行不是一个大的XML文档。您的速度降低不是内存使用或解析速度,而是应用程序逻辑。

好吧,我遇到了
DomDocument
SimpleXML
之间的巨大性能差异。我有大约15 MB的大XML文件,其中包含大约50000个元素,如下所示:

...
<ITEM>
  <Product>some product code</Product>
  <Param>123</Param>
  <TextValue>few words</TextValue>
</ITEM>
...
该脚本在60秒后死亡,超过了最大执行时间错误。仅分析了15000个50k项

因此,我将代码重写为
SimpleXML
version:

$xml = new SimpleXMLElement($external_content);
foreach($xml->xpath('ITEM') as $item) {
    $product_code = (string) $item->Product;
    // ... some other operation
}
1秒后完成所有操作


我不知道这些函数是如何在PHP中内部实现的,但在我的应用程序中(以及我的XML结构中),
DomDocument
SimpleXML

之间确实存在着巨大的性能差异,我还要补充一点,不仅解析是相同的,但大多数常见任务也提供了几乎相同的性能。如果你的应用程序一个慢,另一个也慢。谢谢,这是一个很好的演示。我还有一个问题。如果我只想从提要中获取一个标记的值,该怎么办。哪一个会更快,或者时间差与上面所说的相差不大?谢谢您需要更具体地说明您正在进行的基准测试。(首先,DOM/SXE没有“标记”!)获取元素有多种方法——通过遍历或XPath,使用XPath有多个等价的XPath,它们的性能会有所不同。你为什么不做基准测试呢?更重要的是,您是否遇到过优化需求?最有可能的情况是,您根本不需要担心速度,而且正在过早地进行微优化。我已经对自己的程序进行了一些基准测试,由于我正在解析的数据量很大,因此需要25秒才能完成。我正在寻找性能最好的脚本,因为该脚本将经常运行。我首先问这个问题的原因是因为我已经很久没有使用这些对象了,我选择simplexml是因为它非常简单。我只是想知道这两者之间是否有性能/编码方面的优势。谢谢你的帮助和耐心!您应该通过分析找出瓶颈是什么。解析不是瓶颈。您应该改进算法,或者寻找并行运行部分脚本的方法。使用xpath和仅通过标记获取元素有很大区别。从这些脚本的行为来判断,xpath函数实际上并不会一次恢复所有元素,而是为您提供了一个迭代器对象——这将大大减轻和加快。这和加载文件是一样的——你可以一次加载一个大文件或者读取每一行。因为读取每一行并不需要一次将所有内容加载到内存中,所以它的性能会更好。上面的评论是正确的,不是关于DomDocument vs SimpleXML,而是关于如何迭代。将DomDocument上的迭代从getElementsByTagName改为DOMXPath,使其速度同样快。我对一份约120.000元素的文件进行的测试证实了这一点
$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
}
$xml = new SimpleXMLElement($external_content);
foreach($xml->xpath('ITEM') as $item) {
    $product_code = (string) $item->Product;
    // ... some other operation
}