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>