PHP の switch と ifelse ではどちらが速いですか?

2023-07-27 16:54:05

Git pullの使い- pull コマンド PHP値変換strval()、intval()、floatval()、bool

複数の if 条件判定の場合、コードをわかりやすくするために ifelse の代わりに switch を使用していますが、その効率比較はどうでしょうか。 PHP マニュアルから、誰かがそれを比較していることがわかり、私も彼のコードを実験してみました。

$s = time();
for ($i = 0; $i < 1000000000; ++$i) {
    $x = $i % 10;
    if ($x == 1) {
        $y = $x * 1;
    } elseif ($x == 2) {
        $y = $x * 2;
    } elseif ($x == 3) {
        $y = $x * 3;
    } elseif ($x == 4) {
        $y = $x * 4;
    } elseif ($x == 5) {
        $y = $x * 5;
    } elseif ($x == 6) {
        $y = $x * 6;
    } elseif ($x == 7) {
        $y = $x * 7;
    } elseif ($x == 8) {
        $y = $x * 8;
    } elseif ($x == 9) {
        $y = $x * 9;
    } else {
        $y = $x * 10;
    }
}
print("if: " . (time() - $s) . "sec\n");

$s = time();
for ($i = 0; $i < 1000000000; ++$i) {
    $x = $i % 10;
    switch ($x) {
        case 1:
            $y = $x * 1;
            break;
        case 2:
            $y = $x * 2;
            break;
        case 3:
            $y = $x * 3;
            break;
        case 4:
            $y = $x * 4;
            break;
        case 5:
            $y = $x * 5;
            break;
        case 6:
            $y = $x * 6;
            break;
        case 7:
            $y = $x * 7;
            break;
        case 8:
            $y = $x * 8;
            break;
        case 9:
            $y = $x * 9;
            break;
        default:
            $y = $x * 10;
    }
}
print("switch: " . (time() - $s) . "sec\n");

1000000000回ループして各判定条件に演算を追加した結果、スイッチの効率が向上し、動作が高速になることがわかりました。私のコンピュータでの結果は次のとおりです。

// if: 301sec
// switch: 255sec

switch の方が効率的ですが注意が必要な点があり、まず判定値が数値、浮動小数点数、文字列のみであることです。 第二に、各判断は共通の == 判断です。つまり、次の判断結果は必ずしもあなたの判断結果と似ているわけではありません。

$string = "2string";

switch ($string) {
    case 1:
        echo "this is 1";
        break;
    case 2:
        echo "this is 2";
        break;
    case '2string':
        echo "this is a string";
        break;
}

// this is 2

そうです、== 比較における型強制の問題がまだ残っています。string 値と int 値を比較する場合、それらは int 型に強制され、"2string"強制の結果はちょうど 2 になります。 したがって、switch を使用する場合は、比較値が各ケースのタイプと一致していることを確認する必要があります。そうでないと、予期しないエラーが発生する可能性があります。