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

Каковы лучшие и быстрые методы: если или переключиться?

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 чтобы вы могли избежать этой проблемы все вместе.

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

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

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

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

Согласно 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 с === .