Возможные дубликаты:
еще “если” быстрее, чем “переключатель () случай”?
Какова относительная производительность если/еще по сравнению с переключателем в Java?Я был coding-in-the-run снова...., когда отладчик ступает через оператор выбора, он переходит к объекту, который соответствует условиям сразу, однако когда та же логика указана с помощью то, если/еще он ступает через каждый, если оператор, пока он не находит победителя. Действительно ли оператор выбора более эффективен, или мой отладчик просто оптимизирует шаг через? (не волнуйтесь о синтаксисе/ошибках, я ввел это Так, не знайте, скомпилирует ли он, это - принцип, который я после, я не хотел делать их как ints причина, я неопределенно помню что-то о случае с помощью смещения с ints), я использую C#, но я интересуюсь общим ответом через языки программирования.
switch(myObject.GetType()){ case typeof(Car): //do something break; case typeof(Bike): //do something break; case typeof(Unicycle): //do something break; case default: break; }
VS
Type myType = myObject.GetType(); if (myType == typeof(Car)){ //do something } else if (myType == typeof(Bike)){ //do something } else if (myType == typeof(Unicycle)){ //do something } else{ }
Кажется, что компилятор лучше в оптимизации выключателя выключателя, чем IF-оператор.
Компилятор не знает, является ли порядок оценки IF-утверждений для вас, и не может выполнять какие-либо оптимизации. Вы можете позвонить в методы в IF-операторах, влияющих на переменные. С помощью выявления выясните, он знает, что все пункты могут быть оценены одновременно и могут поставить их в любой порядок наиболее эффективной.
Вот небольшое сравнение:
http://www.blackwasp.co.uk/speedteStifelseSwitch.aspx
Отладчик делает его проще, потому что вы не хотите проходить через фактическое код, который создает компилятор.
Если переключатель содержит более пяти элементов, он реализован с использованием таблицы поиска или хеш-таблица, в противном случае он реализуется с использованием AF..ELSE.
Смотрите тесно связанный вопрос : «Иначе, если« быстрее, чем «коммутатор () Case»? .
Другие языки, чем C #, конечно, реализуют его более или менее по-другому, но переключатель, как правило, более эффективно.
Многие языки программирования оптимизируют оператор коммутатора, чтобы он намного быстрее, чем стандарт, если иначе, если структура предоставлена константы компилятора. Многие языки используют таблицу прыжка или индексированные таблицы для оптимизации операторов переключения. Wikipedia Обсуждает хорошее обсуждение оператора выключателя. Также здесь - это обсуждение оптимизации переключателей в C.
. Одно следует отметить, что операторы переключателя могут быть оскорблены и, в зависимости от случая, может быть предпочтительным использование полиморфизма вместо выписки Отказ Смотри здесь для примера.
Я думаю, что это просто отладчик, который делает его простым. Обратите внимание, что случай и «если список» не в конечном итоге одно и то же. Есть причина, по которой корпус блоки нормально конец с «перерывом». Корпус STMT на самом деле выглядит что-то подобное при разбивке в сборке.
if myObject.GetType() == type of Car
GOTO START_CAR
else if myObject.GetType() == type of Bike
GOTO START_BIKE
LABEL START_CAR
//do something car
GOTO END
LABEL START_BIKE
//do something bike
GOTO END
LABEL END
Если у вас нет перерыва, то корпусные блоки будут пропущены СТМТС «Goto End», и, на самом деле, если вы приземлились в корпусе «Автомобиль», вы фактически запускаете обе разделы
//do something car
//do something bike
GOTO END
r = (colour >> 16) & 0xff;
g = (colour >> 8) & 0xff;
b = colour & 0xff;
-121--3783614- Запись оператора коммутатора в Википедии довольно большая и на самом деле довольно хорошая. Интересные точки:
Странную и интересную оптимизацию с использованием переключателя C см. в Устройство Даффа .
Это может сделать это для операторов Case, поскольку значения являются константами компилятора. Объяснение более подробно здесь http://squence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html
Я полагаю, потому что случаи должны быть постоянными значениями, оператор коммутатора делает равновесие до COTO, поэтому на основе значения переменной он переходит в правильный случай, тогда как в операторе IF / затем он должен оценить каждое выражение.