"Else if" быстрее, чем "switch() case"?

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

Я парень из Паскаля, в настоящее время изучающий С#. Мой вопрос следующий:

Является ли код ниже быстрее, чем создание переключателя?

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;


}

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

Я спрашиваю, потому что моя программа имеет аналогичную структуру (много, много "else if" ). Должен ли я включить их в коммутаторы?

Ответ 1

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

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

Ответ 2

Почему вас это волнует?

99,99% времени, вам все равно.

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

Кроме того, если вам НЕОБХОДИМО заботиться, тогда вы должны выполнять профилирование производительности вашего кода. В этом случае выяснение разницы в производительности между корпусом коммутатора и блоком if-else будет тривиальным.

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

Ответ 3

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

Это вывод:

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

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

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

Ответ 13

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

Ответ 14

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

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