Является ли" 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 case, как это раньше, и, как правило, это не так сложно упростить. Но о, так приятно.
верить это оценка производительности, корпус переключаться быстрее.
вот вывод:
результаты показывают, что оператор switch выполняется быстрее, чем лестница if-else-if. Это связано с возможностью компилятора оптимизировать оператор switch. В случае лестницы if-else-if код должен обрабатывать каждый оператор if в порядке, определенном программистом. Однако, поскольку каждый случай в операторе switch не полагаясь на более ранние случаи, компилятор может переупорядочить тестирование таким образом, чтобы обеспечить самое быстрое выполнение.
еще одна вещь, чтобы рассмотреть: это действительно узкое место вашего приложения? Бывают крайне редкие случаи, когда оптимизация такого рода действительно требуется. Большую часть времени вы можете получить намного лучшие ускорения, переосмыслив свои алгоритмы и структуры данных.
Я бы сказал, что переключатель-это путь, он быстрее и лучше практикуется.
существуют различные ссылки, такие как (http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx), которые показывают тестовые тесты, сравнивающие эти два.
не должно быть трудно проверить, создать функцию, которая переключается или ifelse между 5 числами, бросить rand (1,5) в эту функцию и цикл, что несколько раз во время синхронизации его.
переключатель находится, как правило, быстрее, чем длинный список "Если", потому что компилятор может генерировать таблицы переходов. Чем длиннее список, тем лучше операторе switch серии операторов if.
гораздо более важными, чем преимущества производительности коммутатора (которые относительно невелики, но стоит отметить) являются проблемы читаемости.
Я для одного нахожу оператор switch чрезвычайно ясным в намерениях и чистых пробелах, по сравнению с цепочками ifs.
Я не уверен, но я считаю, что скорость одной или другой меняется в зависимости от языка программирования, который вы используете.
Я обычно предпочитаю использовать переключатель. Таким образом, код является простым для чтения.
технически, они дают точно такой же результат, поэтому они должны быть оптимизируемы в значительной степени таким же образом. Однако есть больше шансов, что компилятор оптимизирует случай коммутатора с таблицей переходов, чем ifs.
Я говорю об общем случае. Для 5 записей среднее число тестов, выполненных для ifs, должно быть меньше 2,5, если вы заказываете условия по частоте. Вряд ли узкое место, чтобы написать домой, если только в очень плотном петля.
switchобычно переводится в таблицу поиска компилятором, если это возможно. Таким образом, поиск произвольного случая-Это O(1), вместо того, чтобы фактически делать несколько сравнений случаев, прежде чем найти тот, который вы хотите.Так что во многих случаях
if/else ifцепи будет медленнее. Однако в зависимости от частоты, с которой ваши случаи поражаются, это может не иметь никакого значения.
короткий ответ: оператор Switch быстрее
оператор if вам нужно два сравнения (при запуске кода примера) в среднем, чтобы добраться до правильного предложения.
оператор switch среднее число сравнений будет одним независимо от того, сколько разных случаев у вас есть. Компилятор / виртуальная машина сделает "таблицу поиска" возможных параметров во время компиляции.
могут ли виртуальные машины оптимизировать оператор if аналогичным образом при запуске этот код часто?
посмотреть http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx
оператор switch в основном ищет таблицу, в которой есть параметры, которые известны, и если оператор похож на логический тип. по мне переключатель и если-то же самое, но для логического переключателя может помочь лучше. в то время как if-else помогает понять и в чтении.
Comments