Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance if-then-else的效率。。。。打破与如果打破_Performance_Control Flow - Fatal编程技术网

Performance if-then-else的效率。。。。打破与如果打破

Performance if-then-else的效率。。。。打破与如果打破,performance,control-flow,Performance,Control Flow,在循环中使用或切换其他控制流选项时,是否对以下控制流选项之一有效率偏好 备选案文1: 备选案文2: 不可以。任何sane编译器都会为这两个编译器生成相同的输出程序集、字节码等 您可以使用gcc-S为这两个版本生成程序集来演示这一点。您可以在特定情况下仔细检查程序集输出,以确保这一点,但我希望任何现代编译器在大多数情况下都会生成相同的代码 然而,为了可读性,我更喜欢第一种形式,因为if/else if/else块链至少更清楚地向我表明选项是互斥的,而一系列不相交的if语句向我暗示选项可能不是互斥的

在循环中使用或切换其他控制流选项时,是否对以下控制流选项之一有效率偏好

备选案文1:

备选案文2:


不可以。任何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
  }