【问题标题】:Efficient loops in PHP [duplicate]PHP中的高效循环[重复]
【发布时间】:2014-05-07 14:50:54
【问题描述】:

以下循环操作在 PHP 中的效率更高:

$k = count($array);
for ($i = 0;  $i < $k; $i++)
{
    echo $array[$i];
}

或者

for ($i = 0;  $i < count($array); $i++)
{
    echo $array[$i];
}

我知道在 JavaScript 中有这样的可能并且更高效:

for (i = 0, j = array.length; i < j; i++)
{
    console.log(array[i]);
}

【问题讨论】:

  • 这个问题只是学术性的,在实践中你不会注意到差异,特别是如果你在迭代时没有改变数组的大小。
  • 您的第一个示例是执行 for 循环的最佳方式,因为您已经缓存了 $k 的值,在您的第二个示例中,您在每次迭代后重新计算。
  • 另外,计数为 O(1):stackoverflow.com/questions/5835241/…
  • 您也可以在 PHP 中使用相同的语法:for ($i = 0, $j = count($array); $i &lt; $j; $i++)

标签: php performance function for-loop


【解决方案1】:

让我们测试一下。

 $array = array();
 $array = array_pad($array, 1000, 0);
 $iters = 1e4;

 $tic = microtime(true);
 for ($jj = 0; $jj < $iters; $jj++) {
   $k = count($array);
   for($i = 0;  $i < $k; $i++) {
       $vv = $array[$i];
   }
 }
 $toc = microtime(true);
 $time = $toc - $tic;
 echo "Time for external \$k..: $time\n";


 $tic = microtime(true);
 for ($jj = 0; $jj < $iters; $jj++) {
   for($i = 0;  $i < count($array); $i++) {
       $vv = $array[$i];
   }
 }
 $toc = microtime(true);
 $time = $toc - $tic;
 echo "Time for count(\$k)....: $time\n";



 $tic = microtime(true);
 for ($jj = 0; $jj < $iters; $jj++) {
   foreach ($array as $i => $v) {
       $vv = $array[$i];
   }
 }
 $toc = microtime(true);
 $time = $toc - $tic;
 echo "Time foreach..........: $time\n";

结果:

 Time for external $k..: 5.2356481552124
 Time for count($k)....: 35.91916513443
 Time foreach..........: 4.0548861026764

【讨论】:

  • 基准测试是此类问题的最佳答案,没错,但 4.91 秒的数字是否正确?我非常怀疑
  • 4 秒?不可能。
  • 大声笑,您是否认为不需要 E-10 的东西?这是数字的一部分,它会带来很大的不同
  • 这些数字严重歪曲了实际时间,让你的好答案看起来很糟糕
  • @Hanky웃Panky 你会如何改进它?
【解决方案2】:

我会在这种情况下使用foreach

来自PHP Docs..

foreach 构造提供了一种迭代数组的简单方法。

为什么foreach 在这种情况下是有效的?

  • 肯定更快,因为您不会像上面那样调用count() 来确定数组的长度。

  • 您甚至可以访问数组的键。

【讨论】:

【解决方案3】:
<?php 

    foreach ($yourArayValue as $test=>$value)
      {
      echo $test;
      }
?>

foreach() 是击球手

【讨论】:

  • 投反对票的原因是什么:(
  • 我没有投反对票,但原因看起来很明显,你给出的建议甚至不是被问到的那个。最初的问题并没有要求 foreach 并且每个人都在回答这个问题,其次只是说一些更好的东西并不能让它变得更好。您必须说明您的索赔理由。
【解决方案4】:

我认为以下会更有效

for ($i = 0;  $i < count($array); $i++)
{
    echo $array[$i];
}

因为没有定义额外的变量来存储需要更少内存空间的数组计数

【讨论】:

  • 引用 James:“您的第一个示例是执行 for 循环的最佳方式,因为您已经缓存了 $k 的值,在您的第二个示例中,您在每次迭代后重新计算”
【解决方案5】:

这个比第二个效率高

<?php 
$k = count($array);
for($i = 0;  $i < $k; $i++)
{
    echo $array[$i];
}
?>

谢谢。

【讨论】:

  • 一些解释为什么它更有效会有所帮助....
  • 因为当您调试代码时,您会知道每次系统需要计算数组中元素的总数,所以最好使用一个变量并传递数组元素的总数,所以循环不需要每次都计算数组元素...
【解决方案6】:

第一个效率更高,第二个每次迭代调用函数count()

【讨论】:

  • 这不是真的,请参阅我对测试结果的回答
  • 您有一个嵌套循环并在第一个循环的每次迭代中调用count()。比第二个更多的工作:/
  • 是的,很抱歉我有一些错误@naoink - 我现在已经修复了它们。我将删除反对票。
  • 没问题,错误是人为的:)
【解决方案7】:

在这种特定情况下,您的第一个示例更快,仅仅是因为评估条件$i &lt; count($array) PHP 将在每个循环后执行count()。所以按照这个逻辑,在你的条件中使用变量会更快,而不是函数。

更实用的方法是使用其他地方提到的 foreach()。

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多