Case vs If Else If: Что более эффективно?

Возможные дубликаты:
"else if" быстрее, чем "switch() case" ?
Какова относительная производительность if/else vs. switch в Java?

Ive снова кодировалось в процессе... когда отладчик проходит через оператор case, он сразу переходит к элементу, который соответствует условиям, однако, когда указанная логика указана с использованием if/else, она проходит через каждый оператор if, пока не найдет победителя. Является ли аргумент case более эффективным, или мой отладчик просто оптимизирует шаг? (не беспокойтесь о синтаксисе/ошибках, я набрал это в SO, не знаю, скомпилирует ли он, его принцип, который я за ним, я не хотел делать их как ints, потому что я смутно помню что-то о case с использованием смещения с ints) Я использую С#, но im заинтересован в общем ответе на языках программирования.

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{

   }

Ответ 1

Кажется, что компилятор лучше оптимизирует оператор switch, чем if-statement.

Компилятор не знает, важна ли вам оценка оценки if-операторов и не может выполнять какие-либо оптимизации там. Вы могли бы вызывать методы в операторах if, влияющих на переменные. С помощью оператора switch он знает, что все предложения могут быть оценены в одно и то же время и могут помещать их в любой порядок, наиболее эффективный.

Здесь небольшое сравнение:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

Ответ 2

Отладчик упрощает работу, потому что вы не хотите переходить к фактическому коду, создаваемому компилятором.

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

См. близкий вопрос "else if" быстрее, чем "switch() case" ?.

Другие языки, кроме С#, будут, конечно, реализовывать его более или менее по-разному, но коммутатор, как правило, более эффективен.

Ответ 3

Многие языки программирования оптимизируют оператор switch так, что он намного быстрее, чем стандартная if-else, если структура при условии, что случаи являются константами компилятора. Многие языки используют таблицу перехода или индексировали таблицу ветвей для оптимизации операторов switch. Wikipedia имеет хорошее обсуждение оператора switch. Кроме того, здесь - это обсуждение оптимизации коммутатора в C.

Следует отметить, что операторы switch можно злоупотреблять и, в зависимости от случая, может быть предпочтительнее использовать полиморфизм вместо операторов switch. См. здесь для примера.

Ответ 4

Я думаю, что это просто отладчик, делающий его простым. Обратите внимание, что случай и "если список" не являются в конечном счете одинаковыми. Существует причина, по которой блоки блоков обычно заканчиваются "break". Случай 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

Ответ 5

Я считаю, что случаи должны быть постоянными значениями, оператор switch делает equivelent из goto, поэтому на основе значения переменной он переходит в правильный случай, тогда как в выражении if/then он должен оценивать каждое выражение.

Ответ 7

Wikipedia Запись оператора switch довольно большая и на самом деле очень хорошая. Интересные моменты:

  • Переключатели не являются неотъемлемо быстрыми. Это зависит от языка, компилятора и конкретного использования.
  • Компилятор может оптимизировать коммутаторы с помощью таблиц переходов или указателей указателей функций.
  • Заявление было вдохновлено какой-то интересной математикой из Stephen Kleene (и другие).

Для странной и интересной оптимизации с помощью переключателя C см. Duff Device.