Почему оператор switch, а не if-else? - PullRequest
59 голосов
/ 16 января 2009

Мне вот уже давно интересно. Я далеко не хардкорный программист, в основном маленькие скрипты на Python, и я написал пару симуляций молекулярной динамики. Для реального вопроса: в чем смысл оператора switch ? Почему вы не можете просто использовать оператор if-else ?

Спасибо за ваш ответ, и, если об этом уже спрашивали, укажите мне ссылку.

EDIT

S.Lott указал, что это может быть дубликатом вопросов If / Else vs. Switch . Если вы хотите закрыть, сделайте это. Я оставлю это открытым для дальнейшего обсуждения.

Ответы [ 8 ]

87 голосов
/ 16 января 2009
Конструкция

A switch легче преобразовать в таблицу jump (or branch) . Это может сделать операторы переключения намного более эффективными, чем if-else , когда метки регистра находятся близко друг к другу. Идея состоит в том, чтобы последовательно поместить в память несколько инструкций перехода, а затем добавить значение в счетчик программ. Это заменяет последовательность инструкций сравнения операцией добавления.

Ниже приведены несколько чрезвычайно упрощенных примеров псевдо-сборки. Во-первых, версия 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. Однако это должно иллюстрировать концепцию.

22 голосов
/ 16 января 2009

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

Подводя итог переключатель оператор дает вам производительность + код элегантности :)

Вот несколько полезных ссылок:

6 голосов
/ 16 января 2009

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

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

6 голосов
/ 16 января 2009

Для выразительности оператор switch / case позволяет группировать несколько случаев, например:

case 1,2,3: do(this); break;
case 4,5,6: do(that); break;

Для повышения производительности компиляторы иногда могут оптимизировать операторы switch в таблицы переходов.

3 голосов
/ 16 января 2009

Помимо других упомянутых удобочитаемости и оптимизации кода в .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;

}
2 голосов
/ 16 января 2009

Может быть полезна возможность пройти через несколько случаев (преднамеренно пропуская оператор break), и, как несколько человек уже сказали, это также быстрее. Возможно, самое важное и наименее важное соображение заключается в том, что он просто делает код более красивым, чем if / else. :)

1 голос
/ 16 января 2009

Переключатель может быть оптимизирован «лучше» некоторыми компиляторами. Существуют подводные камни при использовании оператора switch на определенных языках. В Java коммутатор не может обрабатывать строки, а в VB2005 оператор switch не будет работать с переключателями.
Переключение может быть быстрее и легче для чтения, если-то является более общим и будет работать в большем количестве мест.

0 голосов
/ 30 марта 2013

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

Пример для Javascript, который компилируется в сборку для выполнения на большинстве ядер, включая движок Chrome V8, состоит в том, что операторы switch выполняются на 30-60% медленнее в общем случае: http://jsperf.com/switch-if-else/20

...