PHP:数组和或foreach哪个更快?

PHP:数组和或foreach哪个更快?,php,arrays,optimization,Php,Arrays,Optimization,我正在尝试找出哪种方法更快(如果其中一种方法更快?)。我在这里设计了一个测试: 当我运行那个测试时,我的结果非常不一致。两者差别很大 测试有问题吗? 否则,有人能建议哪一个会更快还是不会更快吗?? 编辑 好的,伙计们,谢谢我在这里编辑了代码板: 经过所有的评论和讨论,我决定使用数组和。我一使用那个微时间(真的)东西,它就开始看起来快多了(array_sum) 为这个建议干杯,哦,我已经添加了一个“for”循环,这样结果会更均匀,但正如结果中所指出的,如果超过一个foreach,几乎不会节省时间。

我正在尝试找出哪种方法更快(如果其中一种方法更快?)。我在这里设计了一个测试:

当我运行那个测试时,我的结果非常不一致。两者差别很大

测试有问题吗?

否则,有人能建议哪一个会更快还是不会更快吗??

编辑 好的,伙计们,谢谢我在这里编辑了代码板: 经过所有的评论和讨论,我决定使用数组和。我一使用那个微时间(真的)东西,它就开始看起来快多了(array_sum)


为这个建议干杯,哦,我已经添加了一个“for”循环,这样结果会更均匀,但正如结果中所指出的,如果超过一个foreach,几乎不会节省时间。

问题是,您的限制非常低,1000。PHP解释器的开销要大得多。我会拿100000000或者类似的东西

然而,我认为
array\u sum
更快,因为它更专业,可能是用fast C实现的

哦,正如Michael McTiernan所说,你必须将
microtime()
的每个实例都更改为
microtime(true)


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

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


此外,在测试之后,结果也没有太大的不同。

老实说,使用人工测试没有什么价值,无论哪种方式,这听起来都像是毫无意义的微观优化,除非您在分析必要的代码后明确指出这是一个问题区域

因此,使用感觉更合适的方法可能是有意义的。我个人喜欢
array\u sum
——毕竟这就是它的用途

$s=微时间()

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

$s = microtime(TRUE);
数组求和耗时0.125188秒求和 数字用了0.166603秒


这类测试需要运行数千次,这样您就可以获得不受微小外部因素影响的大量执行时间。

您需要更大的运行,并且需要平均数次。您还应该将这两个测试分为两个文件。服务器有其他事情正在进行,这将干扰测试计时,因此需要平均多次运行


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

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

下面是一个示例设置:

<?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/>";

12号线发生了什么事?您使用的是带有数组的foreach?这不会影响你的结果吗?没关系。在应用程序完成时,而不是之前,使用探查器来识别瓶颈。然后看看是什么让它慢下来,并对其进行优化。这可能不会节省任何时间,但可读性和懒散性也很重要。代码板也确实不可靠。这个答案更好
for 1000 pass, array_sum took 0.2720000743866 seconds. Result = 50005000000
for 1000 pass, foreach took 1.7239999771118 seconds. Result = 50005000000