web-dev-qa-db-ja.com

Switch Caseの場合とそうでない場合のどちらが速いですか?

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

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

switch(x){
  case 1
    ...
  break;
  default;
} 
64
Ballu Rocks

最初の例は単に間違っています。 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_に対してのみ機能します。

130
ThiefMaster

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

enter image description here

しかし、何千回と呼ばれる関数でマイクロ秒を削る場合にのみ本当に問題になります。

24
Guest

一般的なルールは条件の数が3より大きい場合は常にswitchを使用(読みやすさのため)です。

if/else if/elseはより柔軟です(そのため)、switchは1回だけ条件を計算してから出力をチェックするため、ifは少し高速です。

編集: switchifよりも遅い 結局、そうではないことを誓うかもしれません...

16
Alix Axel

==を使用する場合、switchと比較したif ... elseifのパフォーマンスはほぼ同じです。ただし、===を使用する場合、if ... elseifは約3倍高速です( phpbench による)。

一般的に、3つ以上の比較を行う場合は、最も読みやすいものを使用し、switchを使用する必要があります。パフォーマンスが主な関心事であり、型変換を行う必要がない場合は、if ... elseif===とともに使用します。

3
Dan Bray

使い方次第です。 fxpステータス(オンライン、不在、dnd、オフライン...)がある場合は、スイッチを使用することをお勧めします。

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

しかし、あなたがこのような何かをしたい場合

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

または

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

他の場合は、そのより良い使用。

2
sczdavos

私の意見では、「if/else」は高速ですが、スイッチよりは良くありませんが、私はこれを好む:

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

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

1
user1299518

私は、コンパイラが最終的にそれらを非常に類似した、またはおそらく同一のコードに変えると信じています。

奇妙なことをしているのでなければ、コンパイラの最適化を試みてはいけません。

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

0
will