Почему оператор switch, а не if-else?
Мне это интересно уже некоторое время. Я далеко не хардкорный программист, в основном небольшие скрипты на Python, и я написал пару симуляций молекулярной динамики. Для реального вопроса: Какова точка оператора switch ? Почему вы не можете просто использовать оператор if-else?
Спасибо за ваш ответ, и если это было задано, прежде чем указывать мне ссылку.
ИЗМЕНИТЬ
S.Lott указал, что это может быть дубликат вопросов If/Else vs. Switch. Если вы хотите закрыть, сделайте это. Я оставлю его открытым для дальнейшего обсуждения.
Ответы
Ответ 1
Конструкция переключателя легче перевести в таблицу (или ветку). Это может сделать операторы switch более эффективными, чем if-else, когда метки меток находятся близко друг к другу. Идея состоит в том, чтобы последовательно добавить кучу инструкций перехода в память, а затем добавить значение в счетчик программ. Это заменяет последовательность инструкций сравнения с операцией add.
Ниже приведены некоторые чрезвычайно упрощенные примеры сборки psuedo. Во-первых, версия if-else:
// C version
if (1 == value)
function1();
else if (2 == value)
function2();
else if (3 == value)
function3();
// assembly version
compare value, 1
jump if zero label1
compare value, 2
jump if zero label2
compare value, 3
jump if zero label3
label1:
call function1
label2:
call function2
label3:
call function3
Следующая версия коммутатора:
// C version
switch (value) {
case 1: function1(); break;
case 2: function2(); break;
case 3: function3(); break;
}
// assembly version
add program_counter, value
call function1
call function2
call function3
Вы можете видеть, что полученный код сборки намного компактнее. Обратите внимание, что значение нужно каким-то образом преобразовать для обработки других значений, чем 1, 2 и 3. Однако это должно проиллюстрировать концепцию.
Ответ 2
Коммутатор может быть оптимизирован путем компиляции r - вы получите более быстрый код.
Также я считаю, что это более элегантно при работе с перечислимыми типами.
Подводя итог оператора switch, вы получаете производительность + элегантность кода:)
Вот несколько полезных ссылок:
Ответ 3
Для выразительности оператор switch/case позволяет группировать несколько случаев вместе, например:
case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
Для производительности компиляторы иногда могут оптимизировать операторы switch в таблицах переходов.
Ответ 4
Я игнорирую этот тип низкоуровневой оптимизации, как обычно неважный, и, вероятно, отличается от компилятора компилятором.
Я бы сказал, что основное отличие - читаемость. если /else очень гибко, но когда вы видите коммутатор, вы сразу знаете, что все тесты относятся к одному и тому же выражению.
Ответ 5
Помимо другой упомянутой читаемости кода и оптимизации в .NET, вы также получаете возможность включения перечислений и т.д.
enum Color { Red, Green, Blue };
Color c = Color.Red;
switch (c) // Switch on the enum
{
// no casting and no need to understand what int value it is
case Color.Red: break;
case Color.Green: break;
case Color.Blue: break;
}
Ответ 6
Возможность провалиться через несколько случаев (намеренно исключая выражение о нарушении) может быть полезна, и, как уже говорилось, несколько человек говорят об этом быстрее. Возможно, самое важное и наименее важное соображение заключается в том, что он просто делает код более красивый, чем if/else.:)
Ответ 7
Переключатель может быть оптимизирован "Лучше" некоторыми компиляторами. Есть ловушки с использованием оператора switch на определенных языках. В Java коммутатор не может обрабатывать строки, а в VB2005 оператор switch не будет работать с переключателями.
Переключатель может быть быстрее и легче читать, If-Then более общий и будет работать в большем количестве мест.
Ответ 8
Единственные временные переключатели могут быть быстрее, когда ваши значения case являются константами, а не динамическими или иначе полученными, и когда количество случаев значительно больше времени для вычисления хэша в таблице поиска.
Случай для Javascript, который компилируется для сборки для выполнения на большинстве движков, включая движок Chrome V8, заключается в том, что операторы switch на 30% -60% медленнее выполнять в общем случае: http://jsperf.com/switch-if-else/20