count() in for-Schleifen

Tags:

Als Appetizer etwas Code. ;-)

$a = array('foo', 'bar', 'lala');
for ($i = 0; $i < count($a); $i  ) {
    // ...
}

Es kommt selten vor, dass ich sowas überhaupt brauche, da in diesen Fällen foreach() viel einfacher ist. Dennoch kann es vorkommen, dass eben diese Notation erwünscht ist.

Durch einen Kommentar auf StackOverflow bin ich auf folgenden Ansatz gestossen.

$a = array('foo', 'bar', 'lala');
for ($i = 0, $c = count($a); $i < $c; $i  ) {
    // ...
}

Ich kannte diese Notation nicht und habe deshalb bei grösseren Arrays stehts die Grösse in einer separaten Zeile ausgelesen. Etwa so ...

$a = array('foo', 'bar', 'lala');
$c = count($a);
for ($i = 0; $i < $c; $i  ) {
    // ...
}

Dies ist anzuraten, da count() ansonsten bei jeder Iteration ausgeführt wird. Folgende kleine Benchmark zeigt die Differenz gut auf.

foreach (array(1, 100, 1000, 10000, 100000) as $l)
{
    echo '<h1>' . $l . '</h1>';

    $a = range(1, $i);
    $t1 = microtime(true);
    for ($i = 0; $i < count($a); $i  ) {}
    echo round((microtime(true) - $t1) * 1000, 2) . 'ms';

    echo '<br />';

    $t1 = microtime(true);
    for ($i = 0, $c = count($a); $i < $c; $i  ) {}
    echo round((microtime(true) - $t1) * 1000, 2) . 'ms';
}
Grösse Nicht optimiert Optimiert
1 0.03ms 0.02ms
100 0.29ms 0.03ms
1'000 3.43ms 0.27ms
10'000 27ms 2.41ms
100'000 272.16ms 22.88ms

Da diese Werte teils signifikante Unterschiede aufweisen werde ich mir in Zukunft einfach angewöhnen, stehts die optimierte Notation zu verwenden. So bin ich im Zweifelsfall auf der sicheren Seite und spare sogar eine Zeile Code. ;-)

Ähnliche Artikel

Kommentare