今となってはPHPのfor文の条件にcount()を入れると遅くなるのは常識のようになってしまっていますが,ちょっと前にたしかどこかでそれと逆のことを書いていたような記事があった気がして,まさかとは思いながらテストスクリプトを作って計測してみました。

計測に用いたPHPインタープリタは,Windows版PHP 5.2.6で,スクリプト実行のパフォーマンスに関わるようなextensionは入れていません。

テストスクリプト

count.php
こちらは,forの条件でcount()を思いっきり使います。おそらくこちらの方が遅いと予想・・・

<?php

$seed = range(1,100000);
$a = array();
$count = 0;

function resetArray() {
    global $seed,$a,$count;
    shuffle($seed);
    $a = array_slice($seed,0,50000);
    $count = count($a);
}

$mod = 0;
$results = array();

for($j=0;$j<100;$j++)
{
    resetArray();
    $startTime = microtime(true);
    for($i=0;$i<count($a);$i++) {
        $mod = ($mod + $a[$i]) % 2011;
    }
    $finishTime = microtime(true);
    $results[] = $finishTime - $startTime;
}

echo "Result: ",number_format(array_sum($results)/count($results), 5)," sec";

?>

pre-count.php
こちらは,事前にcount()した結果を$countに保持しておいて,それをforで使います。こちらの方が速いはず。

<?php

$seed = range(1,100000);
$a = array();
$count = 0;

function resetArray() {
    global $seed,$a,$count;
    shuffle($seed);
    $a = array_slice($seed,0,50000);
    $count = count($a);
}

$mod = 0;
$results = array();

for($j=0;$j<100;$j++)
{
    resetArray();
    $startTime = microtime(true);
    for($i=0;$i<$count;$i++) {
        $mod = ($mod + $a[$i]) % 2011;
    }
    $finishTime = microtime(true);
    $results[] = $finishTime - $startTime;
}

echo "Result: ",number_format(array_sum($results)/count($results), 5)," sec";

?>

結果は・・・

予想・・・というか広く知られているとおりcount()はあらかじめ実行しておいた方が速いという結果になりました。

どこで逆になってる記事を見たんだろう? 気のせいだったかもしれません。