2011-02-02 59 views
2

是否有效率优先用于以下控制流选项之一,以用于循环或切换其他循环?if then else的效率.... 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语句中本身并不明智。它在循环中只是非常明智的。没有显示包含循环,这个例子有点误导。 – 2011-02-02 16:48:04

+1

@ S.Lott - 值得注意的是,该问题明确指出“用于循环或开关” – 2011-02-02 16:49:07

回答

4

号任何理智的编译器将生成到相同的输出(装配,字节码,等等)。对彼此而言。

您可以使用gcc -S来演示此操作,以生成两个版本的程序集。

0

您可以在特定的特定情况下仔细检查程序集输出,但我希望任何现代编译器大部分时间都会生成相同的代码。但是,我更喜欢第一种形式的可读性,因为一串if/else if/else块更清楚地向我(至少)表明这些选项是互斥的,而一系列不相交的if语句暗示对我来说这些选项可能不是相互排斥的。但那只是我对风格的主观判断。

0

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

0

如果可能的话,我会在长建议switch语句

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

    . . . 
    default: 
     //TODO 
    } 

如果else语句,这将是更快...

1

你需要的东西是毫不含糊的。

一个breakcase减少了歧义。

break里面埋的if-else一个switch内部是一个灾难性的后果时,这些break之一的省略得到。