Переключение так же плохо, как если бы?

Я читал в StackOverflow, что с помощью

if(someCondition)
{
    someCode();
}
else
{
    alternateCode();
}

может быть неэффективным из-за подверженности неправильному предсказанию перехода (см., например, этот вопрос).

То же самое и с switch-конструкцией, например,

switch (someCondition)
{
    case (someCase):
        something();
        break;
    case (otherCase):
        someOtherInstructions();
        break;
    default:
        defaultAction();
        break;
}

что-нибудь другое в этом отношении (помимо того факта, что я учел три возможности)?


person Mike Warren    schedule 03.06.2013    source источник
comment
Это очень редкое определение «дорого»! Это все равно, что сказать, что 0,0001 доллара — это дорого.   -  person Gabe    schedule 03.06.2013
comment
@Gabe: как всегда, это зависит от приложения. ЕСЛИ вам нужно потратить 0,0001 доллара несколько миллиардов раз, это начинает иметь значение (хотя я согласен, что это вряд ли когда-либо составляет большую часть затрат).   -  person Rody Oldenhuis    schedule 03.06.2013
comment
Я предпочитаю операторы case, потому что их легче читать и они уменьшают вероятность логических ошибок со стороны программиста. Не знаю, есть ли разница в эффективности фактического выполнения.   -  person CaffeineConnoisseur    schedule 03.06.2013
comment
Связанный (возможно, специфичный для Java): stackoverflow.com/questions/2086529/   -  person Rody Oldenhuis    schedule 03.06.2013
comment
Связанный (возможно, специфичный для С++): stackoverflow.com/questions/97987/   -  person Rody Oldenhuis    schedule 03.06.2013
comment
Связанный (возможно, специфичный для С#): stackoverflow.com/questions/445067/if-vs-switch-speed   -  person Rody Oldenhuis    schedule 03.06.2013


Ответы (1)


Выражения if не являются "дорогими", условные переходы могут быть "дорогими". Проблема не в том, какой из множества различных высокоуровневых операторов вы выберете для написания - if, switch, for, while, и т. д.. Проблема в том, что современные компьютеры очень хорошо работают, выполняя безусловный путь инструкций, но когда есть точка принятия решения, они могут замедляться. Поскольку вы не можете сделать ничего интересного в вычислениях без точек принятия решений (то есть, условных ветвей), вы можете также игнорировать выбор языковой конструкции высокого уровня.

person Ross Patterson    schedule 03.06.2013
comment
Операторы switch не обязательно компилируются в условные ветки (подумайте о таблицах переходов). - person sepp2k; 03.06.2013
comment
Я думаю, что главное здесь в том, что не беспокойтесь об этом, если только вы не запускаете фрагмент кода тысячи (или миллионы) раз... - person Mike Warren; 03.06.2013
comment
@ sepp2k Согласен. Но это решение компилятора, и оно может зависеть от конкретных задействованных значений. В любом случае, дело не в том, если против переключателя, а в условном прогнозировании ветвления. - person Ross Patterson; 04.06.2013
comment
длинный ответ => stackoverflow.com/questions/315306/is-if-expensive - person Louis Loudog Trottier; 12.03.2017