do-while is the fastest loop in php?

僤鯓⒐⒋嵵緔 提交于 2019-12-18 13:34:00

问题


I have profiled for, while and do-while loops with something simple:

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

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

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

by comparing microtime() before and after the loops.

The do-while loop is by a considerable amount the fastest loop. do-while is actually faster than while by almost half. I know that they are for different purposes ( while checks the condition before the loop executes and do-while executes at least once ).

I know the general consensus is that while loops are frowned upon and do-while even more so.

My question is why? Considering how many for loops are used in PHP applications, shouldn't do-while be used more? Even with an if statement to check a condition before the loop executes, the performance boost is considerable.

My currently accepted answer is that code legibility is the suspect.


回答1:


  1. Micro optimizations are evil. They reduce readability for no measurable performance gain. Even if your application does have loops with millions of iterators (which I doubt) the difference is still negligible.
  2. The difference between while / do while is smaller than you say: http://codepad.viper-7.com/M8cgt9
  3. To understand why do while is marginally faster, look at the generated opcodes:

    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
    

    The do while loop only has one jump statement (JMPNZ), whereas the while loop needs two (JMPZ, JMP). The for loop needs three jump statements (JMPZNZ, JMP, JMP) and has generally more complex logic.




回答2:


If you're interested in that kind of thing, you may find PHPBench interesting.

My personal opinion is that you should use while, do and for loops where they are most legible. A 6% speed increase on an empty loop isn't significant enough if you're spending most of your time in the database.




回答3:


If you want a fast loop you must unroll it or use a duff device.

You can also shortcut the for-loop (demo):

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

You can also shortcut the do-while loop (demo):

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

But the opcodes are the same.

And here is a modified version of the duff device from php.net:

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++;
}
?>

(This is a modified form of Duff's original device, because PHP doesn't understand the
original's egregious syntax.)

That's algorithmically equivalent to the common form:

<?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


来源:https://stackoverflow.com/questions/8081253/do-while-is-the-fastest-loop-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!