Является ли" else if "быстрее, чем"switch() case"? [дубликат]

Возможные Дубликаты:
есть ли какая-либо существенная разница между использованием if/else и switch-case в C#?

Я бывший парень Паскаль, в настоящее время изучает C#. Мой вопрос таков:

- Это код ниже быстрее, чем сделать переключатель?

int a = 5;

if (a == 1)
{
    ....
}
else if(a == 2)
{
    ....
}
else if(a == 3)
{
    ....
}
else if(a == 4)
{
    ....
}
else
    ....

и выключатель:

int a = 5;

switch(a)
{
    case 1:
        ...
        break;

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
        break;

    default:
        ...
        break;


}

какой из них быстрее?

Я спрашиваю, потому что моя программа имеет подобную структуру (много, много утверждений "еще если"). Превратить их в переключатели?

14 ответов


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

Если коммутатор содержит более пяти элементов, он реализуется с помощью таблицы подстановки или хэш-списка. Это означает, что все элементы получают одинаковое время доступа по сравнению со списком if:s, где последний элемент занимает гораздо больше времени, поскольку он должен сначала оценить каждое предыдущее условие.


Почему тебя это волнует?

99,99% времени, вы не должны заботиться.

такого рода микро-оптимизации, вряд ли повлияют на производительность вашего кода.

кроме того, если вам нужно заботиться, то вы должны делать профилирование производительности в своем коде. В этом случае выяснение разницы в производительности между корпусом коммутатора и блоком if-else было бы тривиальным.

Edit: для ясности: реализуйте любой дизайн яснее и ремонтопригоднее. Обычно при столкновении с огромным переключателем или блоком if-else решение заключается в использовании полиморфизма. Найдите изменяющееся поведение и инкапсулируйте его. Мне приходилось иметь дело с огромным, уродливым кодом случая переключателя, как это раньше, и обычно это не так сложно упростить. Ну да так сытно.


верить эта оценка производительности, корпус переключаться быстрее.

вот вывод:

результаты показывают, что оператор switch выполняется быстрее, чем лестница if-else-if. Это связано с возможностью компилятора оптимизировать оператор switch. В случае лестницы if-else-if код должен обрабатывать каждый оператор if в порядке, определенном программистом. Однако, поскольку каждый случай в операторе switch не полагаясь на более ранние случаи, компилятор может переупорядочить тестирование таким образом, чтобы обеспечить самое быстрое выполнение.


еще одна вещь, чтобы рассмотреть: это действительно узкое место вашего приложения? Бывают крайне редкие случаи, когда оптимизация такого рода действительно необходима. Большую часть времени вы можете получить лучшие ускорения, переосмыслив свои алгоритмы и структуры данных.


Я бы сказал, что переключатель-это путь, он быстрее и лучше практикуется.

есть различные ссылки, например, (http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx) что показывают тесты сравнение двух.


не должно быть трудно проверить, создать функцию, которая переключается или ifelse между 5 номерами, бросить rand (1,5) в эту функцию и цикл, который несколько раз при синхронизации.


Switch обычно быстрее, чем длинный список ifs, потому что компилятор может генерировать таблицу переходов. Чем длиннее список, тем лучше операторе switch серии операторов if.


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

Я для одного нахожу оператор switch чрезвычайно ясным в intent и чистых пробелах, по сравнению с цепочками ifs.


Я не уверен, но я считаю, что скорость одной или другой меняется в зависимости от языка программирования, который вы используете.

обычно я предпочитаю использовать switch. Таким образом, код simplear для чтения.


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

Я говорю об общем случае. Для 5 записей среднее количество тестов, выполненных для ifs, должно быть меньше 2,5, если вы заказываете условия по частоте. Едва ли узкое место, чтобы написать домой, если только в очень плотном петля.


switch обычно переводится компилятором в таблицу поиска, если это возможно. Таким образом, поиск произвольного случая равен O(1), а не фактически делает несколько сравнений случаев, прежде чем найти тот, который вы хотите.

Так во многих случаях if/else if цепи будет медленнее. В зависимости от частоты, с которой ваши случаи поражаются, это может не иметь никакого значения.


короткий ответ: оператор Switch быстрее

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

оператор switch среднее количество сравнений будет одним независимо от того, сколько разных случаев у вас есть. Компилятор / VM сделает "таблицу поиска" возможных параметров во время компиляции.

могут ли виртуальные машины оптимизировать оператор if аналогичным образом, если вы запустите этот код часто?


С switch заявление выражает то же намерение, что и ваш if / else цепочка, но более ограниченным, формальным образом, ваша первая догадка должна заключаться в том, что компилятор сможет оптимизировать ее лучше, так как он может сделать больше выводов об условиях, размещенных в вашем коде (т. е. только одно состояние может быть истинным, сравниваемое значение является примитивным типом и т. д.) Это довольно безопасная общая правда, когда вы сравниваете две аналогичные языковые структуры для среды выполнения спектакль.


посмотреть http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx

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