Почему обратный цикл быстрее обычного (включая тест)

Я провел несколько небольших тестов в 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

нормальный для: 1.0908501148224
обратное значение для: 1.0212800502777

нормальный - обратный: 0,069570064544678

Разница в цикле while

normal while: 1.0395669937134
обратное время: 0.99321985244751
нормальное - обратное: 0,046347141265869

Разница в циклах for и while

обратный для - обратный пока: 0.0280601978302

  

Вопросы

Мой вопрос: может ли кто-нибудь объяснить эти различия в результатах? И был ли мой метод сравнительного анализа верен?

4 голоса | спросил Saif Bechan 10 AMpSat, 10 Apr 2010 03:31:26 +040031Saturday 2010, 03:31:26

1 ответ


0

С помощью обратного цикла 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

Конечно, у вас есть эта дополнительная операция внутри блока кода цикла, но я не совсем уверен, почему это быстрее (возможно, кто-то может заполнить пробел там) Вы заметите, что разница во времени минимальна, потому что эти операции все еще очень быстры. Такие микрооптимизации наиболее эффективны на очень больших циклах.

ответил Andy E 10 AMpSat, 10 Apr 2010 03:39:46 +040039Saturday 2010, 03:39:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132