PHP:哪个更快 - array_sum还是foreach?

时间:2011-03-21 19:56:40

标签: php arrays optimization

我正在尝试找出哪种方法会更快(如果有的话?)。我在这里设计了一个测试:http://codepad.org/odyUN0xg

当我运行该测试时,我的结果非常不一致。两者都变化很大。

测试有问题吗?

否则,任何人都可以建议哪一个会更快或更快?

修改

好的伙计们,谢谢我在这里编辑了键盘:http://codepad.org/n1Xrt98J 随着所有的评论和讨论,我决定采用数组和。一旦我使用了那个microtime(true)的东西,它开始变得更快(array_sum)

为建议干杯,哦,我添加了一个“for”循环,以便结果更均匀,但正如结果所指出的那样,如果超过foreach,几乎没有时间节省。

7 个答案:

答案 0 :(得分:3)

问题在于你采用了非常低的限制,1000。PHP解释器的开销要大得多。我会花1亿或类似的东西。

但我认为array_sum更快,因为它更专业,可能在快速C中实现。

哦,正如Michael McTiernan所说,你必须将microtime()的每个实例都改为microtime(true)http://php.net/manual/en/function.microtime.php

最后,我不会使用codepad作为测试环境,因为你无法控制它。您不知道会发生什么以及您的流程是否暂停。

答案 1 :(得分:3)

老实说,使用人工测试没有什么价值,无论哪种方式,这听起来都是毫无意义的微优化,除非你在分析必要的代码之后将其明确地识别为问题区域。

因此,使用哪种感觉更合适可能是有意义的。我个人非常喜欢array_sum - 毕竟这就是它的存在。

答案 2 :(得分:1)

microtime()的任何实例更改为microtime(true)

此外,经过测试后,结果并没有那么大的不同。

答案 3 :(得分:1)

  

$ s = microtime();

对没有参数的microtime()的调用将返回如下字符串:0.35250000 1300737802。你可能想要这个:

$s = microtime(TRUE);
  

数组总和为0.125188秒   数字花了0.166603秒

这些测试需要运行几千次,这样才能获得不受微小外部因素影响的大量执行时间。

答案 4 :(得分:1)

你需要更大的跑步,并需要平均其中几个。您还应该将两个测试分成两个文件。服务器还有其他事情会干扰测试时间,因此需要平均多次运行。

array_sum()应该是两个中较快的一个,因为没有与之关联的额外脚本解析,但值得检查。

答案 5 :(得分:1)

几乎总是array_sum更快。它更多地取决于您的服务器php.ini配置,而不是array_sum和foreach之间的实际使用情况。

答案 6 :(得分:1)

关于这个问题,对于如下样本设置:

<?php 

set_time_limit(0);

$s = microtime(TRUE);

$array = range(1, 10000);
$sum = 0;
for($j = 0; $j < 1000; $j++){
    $sum += array_sum($array);
}
$s1 = microtime(TRUE);
$diff = $s1 - $s;
echo "for 1000 pass, array_sum took {$diff} seconds. Result = {$sum}<br/>";




$sum = 0;
$s2 = microtime(TRUE);
for($j = 0; $j < 1000; $j++){
    foreach($array as $val){
        $sum += $val;
    }
}
$s3 = microtime(TRUE);
$diff = $s3 - $s2;
echo "for 1000 pass, foreach took {$diff} seconds. Result = {$sum}<br/>";

我得到的结果是foreach总是比较慢。所以这应该回答你的问题。样品:

for 1000 pass, array_sum took 0.2720000743866 seconds. Result = 50005000000
for 1000 pass, foreach took 1.7239999771118 seconds. Result = 50005000000