-PHP Tips- 第9回 switchの条件の順番

switch文に並べる条件の順番は?
【Tips】出現頻度順に並べる方が高速!
【Description】caseに並べる条件は出現頻度の多いものを先に書くべきです。以下のソースでは頻度0.7、0.2、0.1の順に並べて比較しましたが、もし数万件に1件しか含まれないような条件を先に書いてしまうと、かなり無駄なロジックになってしまいます。実際に運用してみないと分からないケースももちろんあるので、データベースで件数をカウントするなどして最適化をしましょう。

<?php
define("WORK_TIME", 10000);

function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}

//出現頻度は70%,20%,10%
$values = array(1, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3);
$cnt = count($values);
$dummy = "";

//値の小さい順の場合
$start_time = getmicrotime();
for($i = 0; $i < WORK_TIME; $i++){
    switch($values[$i % $cnt]){
    case 1:
        $dummy = "";
        break;
    case 2:
        $dummy = "";
        break;
    case 3:
        $dummy = "";
        break;
    default:
    }
}
$no_opt_time = sprintf("%.4f", getmicrotime() - $start_time);

//出現頻度順の場合
$start_time = getmicrotime();
for($i = 0; $i < WORK_TIME; $i++){
    switch($values[$i % $cnt]){
    case 3:
        $dummy = "";
        break;
    case 2:
        $dummy = "";
        break;
    case 1:
        $dummy = "";
        break;
    default:
    }
}
$opt_time = sprintf("%.4f", getmicrotime() - $start_time);
?>

<html>
<head><title>ifとswitchの比較</title></head>
<body>
値が小さい順の結果:<?php echo($no_opt_time);?>秒<br>
出現頻度順の結果:<?php echo($opt_time);?>秒<br>
</body>
</html>
タイトルとURLをコピーしました