【问题标题】:PHP: Which is faster - array_sum or a foreach?PHP:哪个更快 - array_sum 或 foreach?
【发布时间】:2011-07-19 23:13:18
【问题描述】:

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

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

测试有问题吗?

否则,谁能建议哪个更快或不会更快?

编辑

好的,谢谢我在这里编辑了键盘:http://codepad.org/n1Xrt98J 通过所有的 cmets 和讨论,我决定使用数组总和。一旦我使用了那个 microtime(true) 东西,它就开始看起来快了很多(array_sum)

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

【问题讨论】:

  • 第 12 行发生了什么?您正在使用带有 array_sum 的 foreach 吗?这不会影响您的结果吗?
  • 没关系。当你的应用程序完成时,而不是之前,使用分析器来识别瓶颈。然后看看是什么真正减慢了它并优化它。
  • 可能不会节省任何时间,但可读性和惰性也很重要。

标签: php arrays optimization


【解决方案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

【讨论】:

  • 这个答案更好
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      $s = microtime();

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

      $s = microtime(TRUE);
      

      数组总和耗时 0.125188 秒总和 数字耗时 0.166603 秒

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

      【讨论】:

        【解决方案5】:

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

        因此,使用感觉更合适的可能是有意义的。我个人会支持array_sum - 毕竟这就是它的用途。

        【讨论】:

          【解决方案6】:

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

          另外,经过测试,结果并没有太大的不同。

          【讨论】:

            【解决方案7】:

            问题是你设置了一个非常低的限制,1000。PHP 解释器的开销要大得多。我会拿 100000000 或类似的东西。

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

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

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

            【讨论】:

            • 键盘也确实不靠谱。
            猜你喜欢
            • 2011-05-20
            • 1970-01-01
            • 2018-10-31
            • 2011-01-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-23
            相关资源
            最近更新 更多