Performance if-then-else的效率。。。。打破与如果打破
在循环中使用或切换其他控制流选项时,是否对以下控制流选项之一有效率偏好 备选案文1: 备选案文2:Performance if-then-else的效率。。。。打破与如果打破,performance,control-flow,Performance,Control Flow,在循环中使用或切换其他控制流选项时,是否对以下控制流选项之一有效率偏好 备选案文1: 备选案文2: 不可以。任何sane编译器都会为这两个编译器生成相同的输出程序集、字节码等 您可以使用gcc-S为这两个版本生成程序集来演示这一点。您可以在特定情况下仔细检查程序集输出,以确保这一点,但我希望任何现代编译器在大多数情况下都会生成相同的代码 然而,为了可读性,我更喜欢第一种形式,因为if/else if/else块链至少更清楚地向我表明选项是互斥的,而一系列不相交的if语句向我暗示选项可能不是互斥的
不可以。任何sane编译器都会为这两个编译器生成相同的输出程序集、字节码等
您可以使用gcc-S为这两个版本生成程序集来演示这一点。您可以在特定情况下仔细检查程序集输出,以确保这一点,但我希望任何现代编译器在大多数情况下都会生成相同的代码
然而,为了可读性,我更喜欢第一种形式,因为if/else if/else块链至少更清楚地向我表明选项是互斥的,而一系列不相交的if语句向我暗示选项可能不是互斥的。但这只是我对风格的主观判断。我认为从技术上讲,选项1用于空间,选项2用于速度,但任何现代编译器都可能会优化差异,即使没有,差异也可能很小。除非您处于一个严格限制的环境中,每个字节或指令周期都很重要,并且编译器非常简单,否则从长远来看,您最好避免微优化和代码的可读性和可维护性。如果可能,我建议使用switch语句
switch (expr) {
case c1:
//TODO
break;
case c2:
//TODO
break;
. . .
default:
//TODO
}
长时间的if else语句会更快 你需要一些明确的东西 每种情况一次中断可减少歧义
当其中一个中断被忽略时,隐藏在交换机内部if-else中的多个中断会导致灾难。在if语句中,中断本身并不真正合理。这只在循环中才真正合理。没有显示包含的循环,这个示例有点误导。@S.Lott-值得注意的是,这个问题明确说明了在循环或switch@Charles达菲。是的,但是。带有隐藏中断语句的交换机内部的if非常复杂。一个更好的例子会有所帮助。循环有时在顶部或底部有额外的处理。这也有助于澄清这一点。我们中的一些人不太聪明,喜欢更完整的例子。@s.lott@charles:谢谢大家的评论。更新了示例,使其更加清晰。此外,请随意编辑好的观点。虽然我问了效率问题,但我希望人们也能给出他们的编码建议。thxI谈论的是效率。如果中断与案例不匹配,那么尝试维护或修改代码是低效的。
switch(...){
case 1:
if (...) { ... break; }
if (...) { ... break; }
.
.
.
if (...) { ... break; }
case 2:
.
.
.
}
switch (expr) {
case c1:
//TODO
break;
case c2:
//TODO
break;
. . .
default:
//TODO
}