【问题标题】:Does continue statement really increases the speed of the loop in C++?continue 语句真的提高了 C++ 中循环的速度吗?
【发布时间】:2019-08-03 14:08:38
【问题描述】:

所以,我是在线竞争编程的新手,我遇到了一个代码,我在 for 循环中使用了 if else 语句。我想提高循环的速度,在做了一些研究之后,我遇到了 break 和 continue 语句。

所以我的问题是,使用 continue 是否真的提高了循环的速度。

代码:

int even_sum = 0;
for(int i=0;i<200;i++){
      if(i%4 == 0){
         even_sum +=i;
         continue;
      }else{
           //do other stuff when sum of multiple of 4 is not calculated
       }               
  }

【问题讨论】:

标签: c++ if-statement continue


【解决方案1】:

在问题的具体代码中,有continue和没有continue的代码含义相同:无论哪种情况,执行离开even_sum +=i;后,都会流向for语句的结束} .任何质量中等的编译器都应该对这两个选项一视同仁。

continue 的预期目的不是通过请求编译器无论如何都会进行的跳转来加速代码,而是跳过当前循环迭代中不需要的代码——它的作用就像剩余的代码已被封闭在 else 子句中,但可能更具视觉吸引力,并且对人类对代码的感知的破坏性较小。

可以想象,一个非常初级的编译器,甚至是一个不错的编译器,但禁用了优化,可能会为continue 生成一个跳转指令,并且还会为if 语句的“then”子句生成一个跳转指令以跳转在else 子句上。后者永远不会被执行,并且不会对程序执行时间产生直接影响,但它会增加程序的大小,因此可能会产生间接影响。在典型的现代环境中,这种可能性可以忽略不计,您不太可能遇到这种初级编译器。

【讨论】:

    【解决方案2】:

    不,在这里使用continue 没有速度优势。您的两个代码都是相同的,甚至是without optimizations they produce the same machine code

    但是,有时continue 可以使您的代码更高效,如果您以特定方式构建循环,例如

    这个:

    int even_sum = 0;
    for (int i = 0; i < 200; i++) {
        if (i % 4 == 0) {
            even_sum += i;
            continue;
        }
        if (huge_computation_but_always_false_when_multiple_of_4(i)) {
            // do stuff
        }
    }
    

    比:

    更有效率
    int even_sum = 0;
    for (int i = 0; i < 200; i++) {
        if (i % 4 == 0) {
            even_sum += i;
        }
        if (huge_computation_but_always_false_when_multiple_of_4(i)) {
            // do stuff
        }
    }
    

    因为前者不必每次都执行huge_computation_but_always_false_when_multiple_of_4()函数。

    因此,即使这两个代码总是产生相同的结果(假设 huge_computation_but_always_false_when_multiple_of_4() 没有副作用),第一个使用 continue 的代码会快很多。

    【讨论】:

    • 将第二个 if 更改为 else if 也是如此。
    • @PeteBecker 是的,显然,这只是一个粗略的例子。
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2016-08-09
    • 2015-03-24
    • 1970-01-01
    • 2016-01-14
    • 2015-01-18
    • 2019-08-01
    相关资源
    最近更新 更多