Подтвердить что ты не робот

Который быстрее и лучше, Switch Case или если что-то еще, если?

Какой из лучших и быстрых методов: if или switch?

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

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

Ответ 1

Ваш первый пример просто неверен. Вам нужно elseif вместо else.

Если вы используете if..elseif... или switch, это в основном вопрос предпочтения. Производительность такая же.

Однако, если все ваши условия имеют тип x == value с x, одинаковым в каждом условии, switch обычно имеет смысл. Я бы использовал только switch, если есть больше, чем, например, два условия.

Случай, когда switch на самом деле дает вам преимущество в производительности, состоит в том, что переменная часть является вызовом функции:

switch(some_func()) {
    case 1: ... break;
    case 2: ... break;
}

Затем some_func() вызывается только один раз, когда

if(some_func() == 1) {}
elseif(some_func() == 2) {}

он будет вызываться дважды - включая возможные побочные эффекты вызова функции, происходящего дважды. Тем не менее, вы всегда можете использовать $res = some_func();, а затем использовать $res в своих условиях if, чтобы вы могли избежать этой проблемы alltogether.

Случай, когда вы не можете использовать переключатель вообще, - это когда у вас более сложные условия - switch работает только для x == y, когда y является постоянным значением.

Ответ 2

Общее правило - использование switch всякий раз, когда количество условий больше 3 (для удобства чтения).

if/else if/else более гибкий (следовательно, лучше), но switch немного быстрее, потому что он просто вычисляет условие один раз, а затем проверяет вывод, а if должен делать это каждый раз.

EDIT: Кажется, switch медленнее, чем if, я могу поклясться, что это не так...

Ответ 3

В соответствии с phpbench.com, если /elseif немного быстрее, особенно при использовании строгого сравнения (===).

введите описание изображения здесь

Но это будет действительно важно, если вы хотите сбрить микросекунды с функцией, которая будет называться тысячи раз.

Ответ 4

Это зависит от использования. Если у вас есть статус fxp (онлайн, прочь, dnd, offline...), его лучше использовать.

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

Но если вы хотите что-то вроде этого

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

или

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

его лучше использовать, если иначе.

Ответ 5

Я верю, что компилятор превратит их в очень похожий или, возможно, даже идентичный код в конце дня.

Если вы не делаете что-то странное, не пытайтесь оптимизировать компилятор.

Кроме того, время разработки, как правило, более важно, чем время выполнения (за исключением игр), поэтому лучше сделать его более удобочитаемым и поддерживаемым.

Ответ 6

по-моему, "if/else" быстрее, но не лучше, чем переключатель но я предпочитаю это:

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

если вам нужно сделать 1,2 случая, например if/else if/else

Ответ 7

При использовании == производительность if ... elseif по сравнению с switch почти одинаково. Однако при использовании ===, if ... elseif примерно в 3 раза быстрее (в соответствии с: phpbench).

Как правило, вы должны использовать наиболее читаемое и использовать switch при выполнении более 3 сравнений. Если производительность является серьезной проблемой, и вам не нужно делать какие-либо преобразования типов, используйте if ... elseif с ===.