繁体   English   中英

为什么反循环比正常循环更快(包括测试)

[英]Why is an inverse loop faster than a normal loop (test included)

我在PHP循环中运行了一些小测试。 我不知道我的方法是否合适。

我发现反向循环比正常循环快。

我还发现while循环比for循环更快。

建立

<?php

$counter = 10000000;
$w=0;$x=0;$y=0;$z=0;
$wstart=0;$xstart=0;$ystart=0;$zstart=0;
$wend=0;$xend=0;$yend=0;$zend=0;

$wstart = microtime(true);
for($w=0; $w<$counter; $w++){
    echo '';
}
$wend = microtime(true);
echo "normal for: " . ($wend - $wstart) . "<br />";

$xstart = microtime(true);
for($x=$counter; $x>0; $x--){
    echo '';
}
$xend = microtime(true);
echo "inverse for: " . ($xend - $xstart) . "<br />";

echo "<hr> normal - inverse: " 
        . (($wend - $wstart) - ($xend - $xstart)) 
        . "<hr>";

$ystart = microtime(true);
$y=0;
while($y<$counter){
    echo '';
    $y++;
}
$yend = microtime(true);
echo "normal while: " . ($yend - $ystart) . "<br />";

$zstart = microtime(true);
$z=$counter;
while($z>0){
    echo '';
    $z--;
}
$zend = microtime(true);
echo "inverse while: " . ($zend - $zstart) . "<br />";

echo "<hr> normal - inverse: " 
        . (($yend - $ystart) - ($zend - $zstart)) 
        . "<hr>";

echo "<hr> inverse for - inverse while: " 
        . (($xend - $xstart) - ($zend - $zstart))
        . "<hr>";
?>

平均结果

for循环的区别

normal for:1.0908501148224
逆:1.0212800502777

normal - inverse:0.069570064544678

while循环的区别

正常的同时:1.0395669937134
逆时间:0.99321985244751
normal - inverse:0.046347141265869

for循环和while循环的区别

inverse for - inverse while:0.0280601978302

问题

我的问题是有人可以解释这些结果的差异吗? 我的基准测试方法是否正确?

使用inverse for循环,每次迭代只进行一次变量查找:

$w > 0         // <-- one lookup to the $w variable

$w < $counter  // <-- two lookups, one for $w, one for $counter

这就是反转稍快的原因。 此外,while循环每次迭代只有一个操作:

$w < $counter        // <-- one operation while loop

$w < $counter ; $w++ // <-- two operation for loop

当然,你在循环的代码块中有额外的操作,但我不确定为什么它更快(也许有人可以在那里填空)。 您会注意到时差是最小的,因为这些操作仍然非常快。 这种微优化在非常大的环路上最有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM