Случай, по сравнению с Если Еще, Если: Который более эффективен? [дубликат]

Возможные дубликаты:
еще “если” быстрее, чем “переключатель () случай”?
Какова относительная производительность если/еще по сравнению с переключателем в 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{

   }
58
задан Community 23 May 2017 в 12:26
поделиться

7 ответов

Кажется, что компилятор лучше в оптимизации выключателя выключателя, чем IF-оператор.

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

Вот небольшое сравнение:
http://www.blackwasp.co.uk/speedteStifelseSwitch.aspx

85
ответ дан 24 November 2019 в 18:56
поделиться

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

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

Смотрите тесно связанный вопрос : «Иначе, если« быстрее, чем «коммутатор () Case»? .

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

9
ответ дан 24 November 2019 в 18:56
поделиться

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

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

6
ответ дан 24 November 2019 в 18:56
поделиться

Я думаю, что это просто отладчик, который делает его простым. Обратите внимание, что случай и «если список» не в конечном итоге одно и то же. Есть причина, по которой корпус блоки нормально конец с «перерывом». Корпус 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
0
ответ дан 24 November 2019 в 18:56
поделиться
r = (colour >> 16) & 0xff;
g = (colour >> 8) & 0xff;
b = colour & 0xff;
-121--3783614-

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

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

Странную и интересную оптимизацию с использованием переключателя C см. в Устройство Даффа .

0
ответ дан 24 November 2019 в 18:56
поделиться

Это может сделать это для операторов Case, поскольку значения являются константами компилятора. Объяснение более подробно здесь http://squence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html

0
ответ дан 24 November 2019 в 18:56
поделиться

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

0
ответ дан 24 November 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: