do-while是php中最快的循环?

时间:2011-11-10 14:42:37

标签: php performance do-while

我已经为分析了循环的东西很简单:

while ($var < 1000000) {
  ++$var;
}

do {
  ++$var;
} while ($var < 1000000);

for ($var = 0; $var < 1000000; ++$var) {
  //do nothing
}

通过比较循环之前和之后的microtime()。

do-while循环是相当多的最快循环。 do-while 实际上比几乎一半。我知道它们用于不同的目的(,而在循环执行前检查条件,执行至少执行一次)。

我知道普遍的共识是,虽然循环是不受欢迎的,但更进一步。

我的问题是为什么?考虑到PHP应用程序中使用了多少for循环,不应该 do-while 使用更多?即使使用 if 语句在循环执行之前检查条件,性能提升也是相当可观的。

我目前接受的答案是代码易读性是可疑的。

3 个答案:

答案 0 :(得分:15)

  1. 微优化是邪恶的 。它们降低了 no 可衡量的性能增益的可读性。即使你的应用程序确实有数百万个迭代器的循环(我怀疑),差异仍然可以忽略不计。
  2. while / do while之间的差异小于您所说的:http://codepad.viper-7.com/M8cgt9
  3. 要理解为什么do while稍微快一些,请查看生成的操作码:

    line     # *  op                           fetch          ext  return  operands
    ---------------------------------------------------------------------------------
    # while loop
       3     0  >   ASSIGN                                                   !0, 0
       4     1  >   IS_SMALLER                                       ~1      !0, 1000000
             2    > JMPZ                                                     ~1, ->5
             3  >   PRE_INC                                                  !0
             4    > JMP                                                      ->1
             5  > > RETURN                                                   1
    # do while loop
       3     0  >   ASSIGN                                                   !0, 0
       4     1  >   PRE_INC                                                  !0
             2      IS_SMALLER                                       ~2      !0, 1000000
             3    > JMPNZ                                                    ~2, ->1
       4        > > RETURN                                                   1
    # for loop
       3     0  >   ASSIGN                                                   !0, 0
             1  >   IS_SMALLER                                       ~1      !0, 1000000
             2    > JMPZNZ                                        5          ~1, ->6
             3  >   PRE_INC                                                  !0
             4    > JMP                                                      ->1
             5  > > JMP                                                      ->3
             6  > > RETURN                                                   1
    

    do while循环只有一个跳转语句(JMPNZ),而while循环需要两个(JMPZJMP)。 for循环需要三个跳转语句(JMPZNZJMPJMP)并且通常具有更复杂的逻辑。

答案 1 :(得分:1)

如果您想要快速循环,则必须展开它或使用duff设备。

您也可以快捷方式for循环(demo):

for ($var = 0; ++$var < 10; ) {
   // do nothing
}

您还可以快速执行do-while循环(demo):

$var=0;
do {
    echo "Hello";
} while (++$var < 10);

但操作码是相同的。

以下是来自php.net的duff设备的修改版本:

If you're already using the fastest algorithms you can find (on the order of O(1),      
O(n), or O(n log n)), and you're still worried about loop speed, unroll your loops  
using e.g., Duff's Device:

<?php
$n = $ITERATIONS % 8;
while ($n--) $val++;
$n = (int)($ITERATIONS / 8);
while ($n--) {
  $val++;
  $val++;
  $val++;
  $val++;
  $val++;
  $val++;
  $val++;
  $val++;
}
?>

(这是Duff原始设备的修改形式,因为PHP不理解    原始的令人震惊的语法。)

这在算法上等同于常见形式:

<?php
 for ($i = 0; $i < $ITERATIONS; $i++) {
   $val++;
}
?>

$val++ can be whatever operation you need to perform ITERATIONS number of times.

On my box, with no users, average run time across 100 samples with ITERATIONS =     
10000000 (10 million) is:
Duff version:       7.9857 s
Obvious version: 27.608 s

答案 2 :(得分:1)

如果您对此类事情感兴趣,可能会发现PHPBench很有趣。

我个人认为,你应该使用while,do和for循环,使它们最清晰。如果您将大部分时间花在数据库中,那么空循环速度增加6%就不够了。