如果那么其他的效率....如果休息就打破

时间:2011-02-02 16:42:23

标签: performance control-flow

是否有一个效率偏好用于以下控制流选项之一,用于循环或切换另一个?

选项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 个答案:

答案 0 :(得分:4)

没有。任何理智的编译器都会生成相同的输出(汇编,字节码等)。对于两者。

您可以使用gcc -S来演示这两个版本的程序集。

答案 1 :(得分:1)

你需要一些明确的东西。

breakcase可减少歧义。

break中的其中一个switch被忽略时,break内的if-else内的多个{{1}}被隐藏。

答案 2 :(得分:0)

您可以在特定的特定情况下仔细检查程序集输出,但我希望任何现代编译器在大多数情况下都会生成相同的代码。

但是,我更喜欢第一种形式的可读性,因为if / else if / else块链更清楚地向我(至少)表明选项是互斥的,而一系列不相交的if语句意味着我认为这些选择可能并不相互排斥。但这只是我对风格的主观判断。

答案 3 :(得分:0)

我认为技术上option 1代表空间而option 2代表速度,但任何现代编译器都可能会优化差异,即使它没有,差异可能是微不足道的。除非您处于严格限制的环境中,每个字节或指令周期都很重要且编译器非常简单,否则从长远来看,您可能会更好,避免微优化和代码的可读性和可维护性。

答案 4 :(得分:0)

如果可能,我会推荐switch语句

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

     . . .
     default:
        //TODO
  }

在if if else语句中,这会更快......