Neden ters döngü daha hızlı normal bir döngü daha (test dahil)

1 Cevap php

Döngüler üzerinde PHP bazı küçük testler çalışan edilmiştir. Benim yöntemi iyi olup olmadığını bilmiyorum.

Bir ters döngü normal bir döngü daha hızlı olduğunu bulduk.

Ayrıca bir süre devre daha hızlı olduğunu bulduk için bir döngü.

Setup

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

Average Results

The difference in for-loop

normal for: 1.0908501148224
inverse for: 1.0212800502777

normal - ters: ,069570064544678

The difference in while-loop

normal while: 1.0395669937134
inverse while: 0.99321985244751
normal - inverse: 0.046347141265869

The difference in for-loop and while-loop

için ters - ters süre: ,0280601978302

Questions

My question is can someone explain these differences in results? And is my method of benchmarking been correct?

1 Cevap

Döngüsü için tersi ile, sadece yineleme başına bir değişken arama yapıyoruz:

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

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

Ters biraz daha hızlı olmasının nedeni budur. Ayrıca, bir süre döngü tekrarında başına sadece tek bir operasyon var:

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

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

Tabii ki, döngünün kod bloğu içinde bu ekstra çalışma var, ama (belki birisi orada boş doldurabilirsiniz) bu hızlı tam olarak neden emin değilim. Bu operasyonlar hala çok hızlı, çünkü zaman farkı, az fark edeceksiniz. Bu tür mikro-optimizasyon çok büyük döngüler üzerinde en etkili olanlardır.