77

どちらがより良い最速の方法です:ifまたはswitch?

if(x==1){
  echo "hi";
} else if (x==2){
  echo "bye";
}

switch(x){
  case 1
    ...
  break;
  default;
} 
4

9 に答える 9

157

あなたの最初の例は単に間違っています。elseifだけでなく必要ですelse

あなたが使用するif..elseif...switch、主に好みの問題である場合。パフォーマンスは同じです。

ただし、すべての条件がすべての条件で同じタイプx == valueである場合、通常は理にかなっています。また、たとえば2つ以上の条件がある場合にのみ使用します。xswitchswitch

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();使用できるため、この問題を完全に回避できます。$resif

スイッチをまったく使用できない場合は、より複雑な条件がある場合です。定数値である場合にswitchのみ機能しx == yます。y

于 2012-05-27T09:53:04.303 に答える
36

phpbench.comによると、厳密な比較 (===) を使用する場合は特に、if/elseif がわずかに高速です。

ここに画像の説明を入力

しかし、何千回も呼び出される関数でマイクロ秒を短縮したい場合にのみ、問題になります。

于 2016-12-18T02:20:39.573 に答える
20

一般的なルールは、条件の数が 3 を超える場合に使用switchされます(読みやすくするため)。

if//はより柔軟です (したがって優れています) がelse if、条件を 1 回計算してから出力をチェックするだけで、毎回これを行う必要があるため、わずかに高速です。elseswitchif

編集:結局switchより遅いようですがif、そうではなかったと断言できます...

于 2012-05-27T10:51:40.967 に答える
2

用途によります。fxpステータス(オンライン、離れている、dnd、オフラインなど)がある場合は、スイッチを使用することをお勧めします。

switch(status)
{
case 'online':
...
}

しかし、あなたがこのようなものが欲しいなら

if ((last_reply.ContainsKey(name)) && (last_reply[name] < little_ago))

また

if (msg.ToString()[0] == '!')

そうでなければ、そのより良い使用法。

于 2012-05-27T09:55:19.887 に答える
1

この投稿を見つけました: https://gist.github.com/Jeff-Russ/2105d1a9e97a099ca1509de1392cd314これは、switch/case が === の if/elseif よりも高速であることを示しています。

これらは、ネストされた if ステートメントも示しています。これは、はるかに理にかなっていて、はるかに優れた結果を提供します。

彼らの時間:

ネストされた if/elseif === : 0.25623297691345 (ネストされた IF)

スイッチ/ケース : 0.33157801628113 (スイッチケース)

=== の if/elseif : 0.45587396621704 (フラット IF)

=== の場合のみ: 0.45587396621704 (場合のみ)

于 2020-06-25T09:29:52.327 に答える
0

私は、コンパイラーがそれらを非常に類似した、あるいはおそらく同じコードに変換するだろうと信じています。

何か変なことをしているのでない限り、コンパイラーの最適化を試みないでください。

また、開発者の時間は一般にランタイムよりも重要であるため(ゲームを除く)、読みやすく保守しやすいものにすることをお勧めします。

于 2012-05-27T09:55:50.193 に答える
0

私の意見では、「if/else」は高速ですが、switchよりは優れていませんが、私はこれを好みます:

echo ($x==1?"hi":($x==2?"bye":""));

if/else if/else のような 1,2 ケースを実行する必要がある場合

于 2012-05-27T10:02:00.957 に答える