Case vs If Else If: что более эффективно? [дубликат]
Возможные Дубликаты:
является ли "else if" быстрее, чем" switch() case"?
какова относительная производительность if / else против switch в Java?
Я снова кодировал-в-беге....когда отладчик проходит через оператор case, он сразу переходит к элементу, который соответствует условиям, однако, когда та же логика указана с помощью if/else, он проходит через каждый оператор if, пока не найдет победителя. Есть оператор case более эффективен,или мой отладчик просто оптимизирует шаг? (не беспокойтесь о синтаксисе / ошибках, я набрал это так, не знаю, будет ли он компилироваться, его принцип, который мне нужен, я не хотел делать их как 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{
}
7 ответов:
похоже, что компилятор лучше оптимизирует оператор switch, чем оператор if.
компилятор не знает, важен ли для вас порядок вычисления операторов if-и не может выполнять какие-либо оптимизации там. Вы можете вызывать методы в операторах if, влияющих на переменные. С помощью оператора switch он знает, что все предложения могут быть оценены одновременно и могут помещать их в любом порядке, который является наиболее эффективным.
здесь небольшое сравнение:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx
отладчик делает это проще, потому что вы не хотите, чтобы шаг через код, который компилятор создает.
Если коммутатор содержит более пяти элементов, он реализуется с помощью таблицы подстановки или хэш-таблицы, в противном случае он реализуется с помощью if..еще.
см. тесно связанный вопрос является ли "else if" быстрее, чем" switch() case"?.
другие языки, кроме C#, конечно, реализуют его более или менее по-разному, но коммутатор, как правило, более эффективен.
многие языки программирования оптимизируют оператор switch так, чтобы он был намного быстрее, чем стандартный if-else, если структура при условии, что случаи являются константами компилятора. Многие языки используют таблицу переходов или индексированные филиала для оптимизации операторов switch. Википедия имеет хорошее обсуждение оператора switch. Кроме того,здесь это обсуждение оптимизации коммутатора в C.
следует отметить, что операторы switch можно злоупотреблять и, в зависимости от случая, может быть предпочтительно использовать полиморфизм вместо операторов switch. Смотрите здесь для примера.
Я считаю, что поскольку случаи должны быть постоянными значениями, оператор switch делает эквивелент goto, поэтому на основе значения переменной он переходит в правый случай, тогда как в операторе if/then он должен оценивать каждое выражение.
Это можно сделать для операторов case, поскольку значения являются константами компилятора. Объяснение более подробно здесь http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html
Я думаю, это просто отладчик делает его простым. Обратите внимание, что case и "if list" в конечном счете не совпадают. Есть причина, почему case blocks нормально конец с "перерыв". Случай 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Если у вас нет перерыва, то блоки case будут отсутствовать в stmts "GOTO END", и на самом деле, если вы приземлились в случае "car", вы фактически запустите обе секции
//do something car //do something bike GOTO END
Википедии запись оператора Switch довольно большой и на самом деле довольно хорошо. Интересные моменты:
- переключатели не являются по своей сути быстрыми. Это зависит от языка, компилятора и конкретного использования.
- компилятор мая оптимизация переключателей с помощью таблиц переходов или индексированных указателей функций.
- заявление было вдохновлено какой-то интересной математикой от Стивен Клини (и других).
для странная и интересная оптимизация с использованием переключателя C см. устройство Даффа.
Comments