эффективность если тогда еще .... разбить против если сломать, если сломать - PullRequest
2 голосов
/ 02 февраля 2011

Существует ли предпочтение эффективности для одного из следующих вариантов потока управления для использования в контуре или переключения другого?

Опция 1:

switch(...){
    case 1:
        if (...) { ... }
        else if (...) { ... }
        else if (...) { ... }
        .
        .
        .
        else if (...) { ... }
        break;
    case 2:
    .
    .
    .
}

Вариант 2:

switch(...){
    case 1:
        if (...) { ... break; }
        if (...) { ... break; }
        .
        .
        .
        if (...) { ... break; }
    case 2:
    .
    .
    .
}

Ответы [ 5 ]

4 голосов
/ 02 февраля 2011

Нет. Любой здравомыслящий компилятор будет генерировать одинаковые выходные данные (сборка, байт-код и т. Д.). для обоих.

Вы можете продемонстрировать это, используя gcc -S, чтобы сгенерировать сборку для обеих версий.

1 голос
/ 02 февраля 2011

Вам нужно что-то однозначное.

Один break на case уменьшает двусмысленность.

Множество break, похороненное внутри if-else внутри switch, является рецептом катастрофы, когда один из этих break пропущен.

0 голосов
/ 02 февраля 2011

если возможно, я бы порекомендовал оператор switch

  switch (expr) {
     case c1:
        //TODO
        break;
     case c2: 
        //TODO
        break;

     . . .
     default:
        //TODO
  }

на длинных, если операторы else это будет быстрее ...

0 голосов
/ 02 февраля 2011

Я полагаю, технически option 1 для пространства и option 2 для скорости, но любой современный компилятор, скорее всего, оптимизирует разницу, и даже если этого не произойдет, разница, вероятно, будет крошечной.Если вы не находитесь в строго ограничительной среде, в которой учитывается каждый байт или цикл инструкций, а ваш компилятор очень упрощен, в конечном итоге вы можете быть лучше, избегая микрооптимизаций и кода для удобочитаемости и удобства обслуживания.

0 голосов
/ 02 февраля 2011

Вы могли бы дважды проверить вывод сборки в определенных конкретных случаях, но я ожидаю, что любой современный компилятор будет генерировать один и тот же код большую часть времени.

Однако я бы предпочел первую формудля удобочитаемости, потому что цепочка блоков if / else if / else более четко указывает мне (по крайней мере), что параметры являются взаимоисключающими, в то время как серия непересекающихся операторов if подразумевает, что параметры могут не быть взаимоисключающимиНо это только мое субъективное мнение о стиле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...