if と switch

if と switch を戦わせてみた。どっちを使った方が早いんだろう。

ここに載ってたコードをPHPで走らせてみる。↓
(嗚呼、Cで書けよ!という声が沢山聞こえる気がする…。いやね、違うんですよ、最初perlで書いたら、switch文が無いことに気付いてですね…。)

<?php
$loop = 1000000;

callswitch($loop);
print "---------------------\n";
callif($loop);

function callswitch($loop)
{
    $bs = time();
    $n = 0;
    for ($i = 0; $i < $loop; $i++) {
        switch ($n) {
        case 0:
            $n = 1;
            break;
        case 1:
            $n = 2;
            break;
        case 2:
            $n = 3;
            break;
        case 3:
            $n = 4;
            break;
        case 4:
            $n = 5;
            break;
        case 5:
            $n = 6;
            break;
        case 6:
            $n = 7;
            break;
        case 7:
            $n = 8;
            break;
        case 8:
            $n = 9;
            break;
        case 9:
            $n = 0;
            break;
        default:
            $n = 0;
            break;
        }
    }

    $as = time();

    print "switch : ".($as - $bs)." \n";
}

function callif($loop)
{
    $bf = time();

    $n = 0;
    for ($i = 0; $i < $loop; $i++) {
        if ($n == 0) { $n = 1; }
        elseif ($n == 1) { $n = 2; }
        elseif ($n == 2) { $n = 3; }
        elseif ($n == 3) { $n = 4; }
        elseif ($n == 4) { $n = 5; }
        elseif ($n == 5) { $n = 6; }
        elseif ($n == 6) { $n = 7; }
        elseif ($n == 7) { $n = 8; }
        elseif ($n == 8) { $n = 9; }
        elseif ($n == 9) { $n = 0; }
        else { $n = 0; }
    }

    $af = time();

    print "if : ".($af - $bf)." \n";
}

?>

結果は、$loopの回数が少ないと if の勝ち。$loopの回数が多くなると switch の勝ち。

参考にしたページと同じ結果になった。ふむ。

先日、とある人のコードで、

$count = 0;
foreach ($hogearray as $hoge) {
    switch ($count) {
    case 0:
        hoge0;
        break;
    case 1:
        hoge1;
        break;
    case 2:
        hoge2;
        break;
    case 3:
        hoge3;
        break;
    case 4:
        hoge4;
        break;
    case 5:
        hoge5;
        break;
    default:
        defo;
        break;
    }
    $count++;
}

というのを見て唖然としたので、調べたくなった次第です。