De traagheid van count() in een loop (2)

Door AtleX op donderdag 06 december 2007 16:57
Categorie: PHP, Views: 652

Naar aanleiding van Xander's reactie op mijn vorige post over dit onderwerp heb ik nog wat benchmarks gedaan:

Foreach()

PHP:

1
2
3
4
5
6
7
<?php
foreach ($arrayItems as $currentOuterItem)
{
    foreach ($arrayItems as $currentInnerItem)
    {
        // Doe iets
    }
}
?>

Dat levert een resultaat op wat me lang niet tegenvalt, namelijk: 0.1648 seconden.

While()
De oude vertrouwde while()-loop met een count() bij elke iteratie blijkt toch nog wat sneller te zijn dan de for(). Hij komt namelijk tot een gemiddelde tijd (over 10 metingen) van 0.3529 seconden met de volgende code:

PHP:

1
2
3
4
5
6
7
8
9
10
<?php
while ($i < count($arrayItems))
{
    $j = 0;
    while ($j < count($arrayItems))
    {
        // Doe iets
        $j++;
    }
    $i++;
}
?>


Ook hier heb ik weer getest een variabele met het aantal items zodat count() maar 1x aangeroepen hoeft te worden:

PHP:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$numberOfItems = count($arrayItems);
$i = 0;
while ($i < $numberOfItems)
{
    $j = 0;
    while ($j < $numberOfItems)
    {
        // Doe iets
        $j++;
    }
    $i++;
}
?>

Dat blijkt tot mijn verrassing de snelste te zijn, namelijk een gemiddelde van 0.0871 seconden. Het scheelt maar 0,1 seconden met de snelste for() oplossing, maar toch. :+

Overzicht van de resultaten:

LoopResultaat (in seconden)
For() met count() bij elke iteratie0.4338
For() met count() vooraf0.0988
Foreach()0.1648
While() met count() bij elke iteratie0.3529
While() met count() vooraf0.0871

Volgende: PHP performance testen 07-12
Volgende: Hehe, die baardaap is weer het land uit 06-12

Reacties


Door T.net user Wits, zaterdag 08 december 2007 02:45

Deze tip is ook te vinden op http://reinholdweber.com/?p=3

Wel leuk leesvoer voor de php devvers onder ons.

Door T.net user Toolskyn, vrijdag 25 januari 2008 11:23

Maar een foreach 'simuleren' met andere constructies is toch een vreselijk karwij (voor zover het uberhaupt kan), dus er zijn wel degelijk situaties waar de foreach boven een for met count() vooraf gaat.

Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)

Tiep de tekens in onderstaand anti-spam plaatje over: