替代慢速PHP SimpleXmlElement转换为字符串

时间:2015-12-21 16:38:37

标签: php string performance casting simplexml

有没有人知道将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)])

代码甚至可以查看更多节点,但速度仍然快得多。所以,在我看来,这里投射的字符串非常慢。

有没有人有更快的替代字符串演员?

1 个答案:

答案 0 :(得分:0)

令人惊讶的是,正如@Gordon指出的那样,Linux上的性能实际上并没有那么大差异。

由于原始测试仅在Windows上完成,我在Linux上重新测试了它,你知道什么...... XPath-way和node-walking-way之间的区别已经消失。

对我而言,因为我实际上是在为Linux(prod平台)编写这个。但是在构建Windows时仍然需要注意。