我已经为分析了,时和做循环的东西很简单:
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 语句在循环执行之前检查条件,性能提升也是相当可观的。
我目前接受的答案是代码易读性是可疑的。
答案 0 :(得分:15)
while
/ do while
之间的差异小于您所说的:http://codepad.viper-7.com/M8cgt9 要理解为什么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
循环需要两个(JMPZ
,JMP
)。 for
循环需要三个跳转语句(JMPZNZ
,JMP
,JMP
)并且通常具有更复杂的逻辑。
答案 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%就不够了。