2011-02-02 6 views
2

Есть ли коэффициент эффективности для одного из следующих вариантов потока управления для использования в цикле или для переключения другого?Эффективность if then else .... break versus if break if break

Вариант 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: 
    . 
    . 
    . 
} 
+1

Перерыв на самом деле не является разумным в выражении 'if'. Это действительно разумно в цикле. Не показывая содержащийся цикл, пример является крошечным битом, вводящим в заблуждение. –

+1

@ S.Lott. Примечательно, что вопрос явно указывает «для использования в цикле или коммутаторе» –

+1

@Charles Duffy. Да, но. Если внутри коммутатора с закодированными словами 'break' чрезвычайно сложно. Лучшим примером может помочь. Цикл иногда имеет дополнительную обработку сверху или снизу. Это также помогает уточнить это. Некоторые из нас не такие блестящие и как более полные примеры. –

ответ

4

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

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

0

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

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

0

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

0

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

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

    . . . 
    default: 
     //TODO 
    } 

переключателя на долго, если другое заявление, это будет быстрее ...

1

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

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

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

+0

хороший момент. хотя я спросил об эффективности, я надеялся, что люди также дадут свои рекомендации по кодированию. thx – 4myle

+0

Я говорил об эффективности. Неэффективно пытаться поддерживать или адаптировать код, где 'break' не совпадают с' case' s. –