有没有人知道将SimpleXmlElement转换为字符串的替代方法? 标准字符串转换非常慢:
$myString = (string)$simpleXmlElement->someNode;
我需要知道哪一个更快找到具有特定文本值的元素:XPath或遍历节点......所以我写了一个简单的脚本来测量两种方式的1000次迭代的持续时间。
第一个结果是XPath慢得多,但后来我发现我忘记了节点行走部分中的字符串。当我修复它时,节点行走要慢得多。 因此,只有演员才能翻转整个结果。
请查看以下代码以了解手头的问题:
<pre>
<?php
//---------------------------------------------------------------------------
date_default_timezone_set('Europe/Amsterdam');
error_reporting(E_ALL);
//---------------------------------------------------------------------------
$data = <<<'EOD'
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<children>
<child><test>ads</test></child>
<child><test>sdf</test></child>
<child><test>dfg</test></child>
<child><test>fgh</test></child>
<child><test>ghj</test></child>
<child><test>hjk</test></child>
<child><test>jkl</test></child>
<child><test>ads</test></child>
<child><test>sdf</test></child>
<child><test>dfg</test></child>
<child><test>fgh</test></child>
<child><test>ghj</test></child>
<child><test>hjk</test></child>
<child><test>jkl</test></child>
<child><test>123</test></child>
<child><test>234</test></child>
<child><test>345</test></child>
<child><test>456</test></child>
<child><test>567</test></child>
<child><test>678</test></child>
<child><test>789</test></child>
<child><test>890</test></child>
<child><test>90-</test></child>
<child><test>0-=</test></child>
<child><test>qwe</test></child>
</children>
</root>
EOD;
$xml = new SimpleXMLElement($data);
$values = array('123', '234', '345', '456', '567', '678', '789', '890', '90-', '0-=', 'qwe');
$valCount = count($values);
$tries = 1000;
//---------------------------------------------------------------------------
echo("Running XPath... ");
$startTime = microtime(true);
for ($idx=0; $idx<$tries; $idx++)
$xml->xpath('/root/children/child[test="'.$values[($idx % $valCount)].'"]');
$duration = microtime(true) - $startTime;
echo("Finished in: $duration\r\n");
//---------------------------------------------------------------------------
echo("Running NodeWalk... ");
$startTime = microtime(true);
for ($idx=0; $idx<$tries; $idx++)
{
$nodes = $xml->children->child;
foreach ($nodes as $node)
if ((string)$node->test == $values[($idx % $valCount)])
break;
}
$duration = microtime(true) - $startTime;
echo("Finished in: $duration\r\n");
//---------------------------------------------------------------------------
?>
</pre>
更改线路时:
if ((string)$node->test == $values[($idx % $valCount)])
为:
if ($node->test == $values[($idx % $valCount)])
代码甚至可以查看更多节点,但速度仍然快得多。所以,在我看来,这里投射的字符串非常慢。
有没有人有更快的替代字符串演员?
答案 0 :(得分:0)
令人惊讶的是,正如@Gordon指出的那样,Linux上的性能实际上并没有那么大差异。
由于原始测试仅在Windows上完成,我在Linux上重新测试了它,你知道什么...... XPath-way和node-walking-way之间的区别已经消失。
对我而言,因为我实际上是在为Linux(prod平台)编写这个。但是在构建Windows时仍然需要注意。