在C函数末尾的循环中,break和return是否有显著的性能差异?

Is there significant performance difference between break and return in a loop at the end of a C function?

本文关键字:是否 性能 return break 函数 循环      更新时间:2023-10-16

以以下(Obj-)C(++)代码段为例:

// don't blame me for the 2-space indents. It's insane to type 12 spaces.
int whatever(int *foo) {
  for (int k = 0; k < bar; k++) { // I know it's a boring loop
    do_something(k);
      if (that(k))
        break; // or return
    do_more(k);
  }
}

一个朋友告诉我,使用break不仅更符合逻辑(并且当有人想要在函数中添加一些东西时,使用return会引起麻烦),而且还会产生更快的代码。据说,在这种情况下,处理器对jmp -ly指令的预测比ret指令的预测要好。

或者我当然同意他的第一点,但是如果确实有一些显著的差异,为什么编译器不优化它?

如果键入2个空格是疯狂的,请使用具有自动缩进功能的体面的文本编辑器。 4空格缩进比 2空格更具可读性。

当你编写C代码时,可读性应该是一个基本的值。

应该根据上下文选择使用breakreturn,以使您的代码更容易遵循和理解。如果不是对别人,你就是在帮你自己的忙,几年后你会阅读自己的代码,寻找一个虚假的错误,并试图弄明白它的意义。

无论你选择哪个选项,编译器都会以自己的方式优化你的代码,不同的编译器、版本或配置会有不同的优化方式。这种选择不会产生明显的差异,即使这种可能性不大,也不会持久。

关注算法的选择,数据结构,内存分配策略,可能的内存布局缓存影响…对于速度和整体效率而言,这些比局部微优化重要得多。

任何编译器都能够优化跳转到跳转。但实际上,在退出之前可能会有一些清理工作要做。当你有疑问的时候,就侧写。我看不出这有什么区别。

在风格上,特别是在C中,当它超出作用域时,编译器不会为我清理东西,我更喜欢有一个单一的返回点,尽管我没有走到goto的地步。

相关文章: