Какой из лучших и быстрых методов: if или switch?
if(x==1){
echo "hi";
} else if (x==2){
echo "bye";
}
switch(x){
case 1
...
break;
default;
}
Какой из лучших и быстрых методов: 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
, если есть больше, чем, например, два условия.
Случай, когда 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
является постоянным значением.
Общее правило - использование switch
всякий раз, когда количество условий больше 3 (для удобства чтения).
if
/else if
/else
более гибкий (следовательно, лучше), но switch
немного быстрее, потому что он просто вычисляет условие один раз, а затем проверяет вывод, а if
должен делать это каждый раз.
EDIT: Кажется, switch
медленнее, чем if
, я могу поклясться, что это не так...
В соответствии с phpbench.com, если /elseif немного быстрее, особенно при использовании строгого сравнения (===).
Но это будет действительно важно, если вы хотите сбрить микросекунды с функцией, которая будет называться тысячи раз.
Это зависит от использования. Если у вас есть статус fxp (онлайн, прочь, dnd, offline...), его лучше использовать.
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":""));
если вам нужно сделать 1,2 случая, например if/else if/else
При использовании ==
производительность if ... elseif
по сравнению с switch
почти одинаково. Однако при использовании ===
, if ... elseif
примерно в 3 раза быстрее (в соответствии с: phpbench).
Как правило, вы должны использовать наиболее читаемое и использовать switch
при выполнении более 3 сравнений. Если производительность является серьезной проблемой, и вам не нужно делать какие-либо преобразования типов, используйте if ... elseif
с ===
.