Как отчет о работе коммутатора Реализован или работает внутри страны?
Я где-то читал, что оператор switch
использует "Двоичный поиск" или некоторые методы сортировки, чтобы точно выбрать правильный случай, и это увеличивает его производительность по сравнению с лестницей else-if.
А также, если мы дадим случай, чтобы коммутатор работал быстрее? это так? Можете ли вы добавить свои ценные предложения по этому поводу?
Мы обсудили здесь о том же и планировали опубликовать в качестве вопроса.
Ответы
Ответ 1
Фактически до компилятора, как выполняется оператор switch
в коде.
Однако я понимаю, что когда он подходит (то есть относительно плотные случаи), используется таблица перехода.
Это означало бы что-то вроде:
switch(i) {
case 0: doZero(); break;
case 1: doOne();
case 2: doTwo(); break;
default: doDefault();
}
В итоге все будет скомпилировано к чему-то вроде (ужасный псевдоассемблер, но, на мой взгляд, он должен быть ясным).
load i into REG
compare REG to 2
if greater, jmp to DEFAULT
compare REG to 0
if less jmp to DEFAULT
jmp to table[REG]
data table
ZERO
ONE
TWO
end data
ZERO: call doZero
jmp END
ONE: call doOne
TWO: call doTwo
jmp END
DEFAULT: call doDefault
END:
Если это не так, существуют другие возможные реализации, которые позволяют в некоторой степени "лучше, чем последовательность условных выражений".
Ответ 2
Как реализуется swtich, зависит от того, какие значения у вас есть. Для значений, близких к диапазону, компилятор обычно генерирует таблицу перехода. Если значения находятся далеко друг от друга, он будет генерировать связанную ветвь, используя что-то вроде двоичного поиска, чтобы найти правильное значение.
Порядок операторов switch как таковой не имеет значения, он будет делать то же самое, независимо от того, есть ли у вас порядок в восходящем, нисходящем или случайном порядке - делайте то, что имеет наибольшее значение в отношении того, что вы хотите сделать.
Если ничего другого, коммутатор обычно намного легче читать, чем последовательность if-else.
Ответ 3
В какой-то googling я нашел интересную ссылку и планировал опубликовать ее в качестве ответа на мой вопрос.
http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem
Комментарии приветствуются.