どちらが良いと最速の方法ですか:ifまたはswitch?
if(x==1){
echo "hi";
} else if (x==2){
echo "bye";
}
switch(x){
case 1
...
break;
default;
}
最初の例は単に間違っています。 elseif
だけでなく、else
が必要です。
_if..elseif...
_またはswitch
を使用する場合は、主に好みの問題です。パフォーマンスは同じです。
ただし、すべての条件のタイプが_x == value
_であり、x
がすべての条件で同じである場合、switch
は通常意味があります。また、switch
を使用するのは、たとえば2つの条件。
switch
が実際にパフォーマンス上の利点をもたらすのは、変数部分が関数呼び出しの場合です。
_switch(some_func()) {
case 1: ... break;
case 2: ... break;
}
_
その後、some_func()
は一度だけ呼び出されます
_if(some_func() == 1) {}
elseif(some_func() == 2) {}
_
2回呼び出される関数呼び出しの副作用を含む2回呼び出されます。ただし、常に$res = some_func();
を使用してからif
条件で_$res
_を使用できます。この問題をすべて回避できます。
cannot switchを使用する場合は、より複雑な条件がある場合です。switch
は、y
が定数値である_x == y
_に対してのみ機能します。
一般的なルールは条件の数が3より大きい場合は常にswitch
を使用(読みやすさのため)です。
if
/else if
/else
はより柔軟です(そのため)、switch
は1回だけ条件を計算してから出力をチェックするため、if
は少し高速です。
編集: switch
はif
よりも遅い 結局、そうではないことを誓うかもしれません...
==
を使用する場合、switch
と比較したif ... elseif
のパフォーマンスはほぼ同じです。ただし、===
を使用する場合、if ... elseif
は約3倍高速です( phpbench による)。
一般的に、3つ以上の比較を行う場合は、最も読みやすいものを使用し、switch
を使用する必要があります。パフォーマンスが主な関心事であり、型変換を行う必要がない場合は、if ... elseif
を===
とともに使用します。
使い方次第です。 fxpステータス(オンライン、不在、dnd、オフライン...)がある場合は、スイッチを使用することをお勧めします。
switch(status)
{
case 'online':
...
}
しかし、あなたがこのような何かをしたい場合
if ((last_reply.ContainsKey(name)) && (last_reply[name] < little_ago))
または
if (msg.ToString()[0] == '!')
他の場合は、そのより良い使用。
私の意見では、「if/else」は高速ですが、スイッチよりは良くありませんが、私はこれを好む:
echo ($x==1?"hi":($x==2?"bye":""));
if/else if/elseなどの1,2のケースを実行する必要がある場合
私は、コンパイラが最終的にそれらを非常に類似した、またはおそらく同一のコードに変えると信じています。
奇妙なことをしているのでなければ、コンパイラの最適化を試みてはいけません。
また、一般に開発者の時間はランタイムよりも重要です(ゲームを除く)。そのため、より読みやすく保守しやすいものにすることをお勧めします。