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{

}
655   7  

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

    Ничего не найдено.