C/C++:GOTO比WHILE和FOR更快吗?

Art*_*wan 8 c performance loops goto

我知道,每个人都讨厌GOTO,没有人推荐它.但那不是重点.我只想知道,哪个代码最快:

  1. goto

    int i=3;
    loop:
    printf("something");
    if(--i) goto loop;
    
    Run Code Online (Sandbox Code Playgroud)
  2. while

    int i=3;
    while(i--) {
        printf("something");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. for

    for(int i=3; i; i--) {
        printf("something");
    }
    
    Run Code Online (Sandbox Code Playgroud)

Gab*_*abe 16

一般来说,for并且while循环被编译到同样的事情goto,所以它通常不会有所作为.如果你有疑虑,你可以随意尝试这三个,看看哪个需要更长的时间.即使你循环十亿次,你也无法衡量差异.

如果你看看这个答案,你会看到,编译器可以生成准确的相同的代码for,while以及goto(仅在这种情况下,没有条件).


Har*_*lby 7

我唯一一次看到对 goto 的论证是在 W. Richard Stevens 的一篇文章或书籍中。他的观点是,在代码的一个非常时间关键的部分(我相信他的例子是网络堆栈),嵌套的 if/else 块和相关的错误处理代码可以使用 goto 以一种产生有价值的不同的方式重做。

就我个人而言,我不是一个足够优秀的程序员,无法与 Stevens 的工作争论,所以我不会尝试。跳转可以是性能相关的问题是有用的,但极限就是这样是相当严格的。


Mat*_*hew 6

写短程序,然后执行此操作:

gcc -S -O2 p1.c 
gcc -S -O2 p2.c 
gcc -S -O2 p3.c 
Run Code Online (Sandbox Code Playgroud)

分析输出,看看是否有任何差异.一定要引入一定程度的不可预测性,以便编译器不会将程序优化为零.

编译器在优化这些微不足道的问题方面做得很好.我建议不要担心它,而是专注于让你作为程序员更有效率的东西.

速度和效率是一个值得担心的好事,但99%的时间都涉及使用适当的数据结构和算法...而不用担心a for是否比a while或a goto等更快.