在C函数末尾的循环中,break和return是否有显著的性能差异?
Is there significant performance difference between break and return in a loop at the end of a C function?
以以下(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代码时,可读性应该是一个基本的值。应该根据上下文选择使用break
或return
,以使您的代码更容易遵循和理解。如果不是对别人,你就是在帮你自己的忙,几年后你会阅读自己的代码,寻找一个虚假的错误,并试图弄明白它的意义。
无论你选择哪个选项,编译器都会以自己的方式优化你的代码,不同的编译器、版本或配置会有不同的优化方式。这种选择不会产生明显的差异,即使这种可能性不大,也不会持久。
关注算法的选择,数据结构,内存分配策略,可能的内存布局缓存影响…对于速度和整体效率而言,这些比局部微优化重要得多。
任何编译器都能够优化跳转到跳转。但实际上,在退出之前可能会有一些清理工作要做。当你有疑问的时候,就侧写。我看不出这有什么区别。
在风格上,特别是在C中,当它超出作用域时,编译器不会为我清理东西,我更喜欢有一个单一的返回点,尽管我没有走到goto
的地步。
相关文章:
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 不同版本的编译器(例如GCC)是否会产生不同的性能?
- 在现代C++中,侵入式容器是否仍然比非侵入式容器具有性能优势?
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 隐式转换函数的返回对象时是否会影响性能?
- 为数组赋值时是否存在性能差异
- 在类中始终使用此指针是否有任何性能成本
- 在渲染之前直接上传是否会对性能产生负面影响
- 我是否错过了什么,或者虚拟呼叫的性能并不像人们所说的那样糟糕
- 使用 OpenGL 窗口(如 GLFW)或周围的窗口(如 GTK 或 SDL)是否存在性能差异?
- 在将其尺寸较大的向量移动到容量较小的向量之前,是否可以通过使用Reserve()来提高代码性能
- QSqlQuery 绑定值与 BindValues 与 QString.arg() 是否存在性能差异
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- 在C++代码中使用纯 C 库是否有性能下降/损失
- 使用 const CString& 而不是单独使用 CString 作为函数参数是否有任何性能优势?
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 是否有更好的方法(性能提高 /内置功能)获得矩形的旋转角度
- 在较大的架构上使用UINT8_T时,是否存在性能问题
- 对小型任务多次使用std::async是否性能友好