是否有一个效率偏好用于以下控制流选项之一,用于循环或切换另一个?
选项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:
.
.
.
}
答案 0 :(得分:4)
没有。任何理智的编译器都会生成相同的输出(汇编,字节码等)。对于两者。
您可以使用gcc -S
来演示这两个版本的程序集。
答案 1 :(得分:1)
你需要一些明确的东西。
每break
个case
可减少歧义。
当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语句中,这会更快......