C++などのコンパイラ言語では、一般にif文でもswitch文でも書ける処理はswitch文で書く方が高速になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | - ! - ! - | | | | ! |
|
…とはいってもそこまで気にするほどの差は無く、それよりもソースコード見やすさの方がよっぽど重要ですが。
それに対してPHP等のインタプリタ言語では、大抵の実装において、if文とswitch文に速度の差はほぼありません。
if文でもswitch文でも結局は上から順に読み取って等価チェックするしかないためです。
PHPマニュアルのswitchの項には次のように書いてありますが、これは比較元の話です。
if文でも予め比較元の計算結果を別の変数に入れておけば同じことです。
switch文では、条件は1度だけ評価され、 その結果が各case文と比較されます。 elseif文では、条件は、再度評価されます。 使用する条件が単純な比較処理よりも複雑な処理を行ったり、 重い繰り返し処理を行う場合、switchの方が より処理が速い可能性があります。
条件分岐において、コンパイラ言語でもインタプリタ言語でも有用な高速化の方法としては次のようなものが考えられます。
PHPで二番目を実現する方法の一つに、連想配列を使う方法があります*1。
例えば次のようなswitch文を考えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
もし $unitIds の要素数が多かった場合、ループ回数が増え、それだけswitch文による分岐処理の回数が増えます。
また、case句が何十個もあったりすると、 $id の値によっては比較回数がかなり多くなり、それだけ時間が掛かります。
この関数が何度も呼び出されるのであればなおさらです。
ここで連想配列を使うと、上述のコードは次のように置き換えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
一応issetで存在チェックをしていますが、IDが有効な値であるという保証があるならばif文すら不要になります。
実際に渡されるIDのばらけ具合にもよりますが、大抵の場合においてはこちらの方がかなり高速になります。
特に後ろのIDが多い場合の速度はswitch文の比ではなく、分岐数やループ回数によっては秒単位の差が出ます。
ループ内や何度も呼び出されるような処理では結構重要なテクニックではないかと思います。