哪个for循环在C++中更有效
Which for loop is more efficient in C++?
我的朋友和我在工作中正在争论这三个for循环中哪一个在C++中更有效(只是为了举例,它们将循环10次):
//A)
for(int i = 0; i<10; i++)
{
// Do stuff.
}
//B)
for(int i = 0; i< 10; ++i)
{
// Do stuff.
}
//C)
for(int i = 11; --i;)
{
// Do stuff.
}
// D)
// Anything you guys know that is better.
那么,哪一个是最好的,为什么?
任何优秀的编译器都不会因为使用哪个版本而惩罚您。正如您所看到的,所有的循环都可以归结为相同的代码,其中可能有一条指令被重新排序。
选择一个可读性最好、能清楚地传达你想做什么的
如果你对没有优化的情况感兴趣,可以点击这里:
示例A
示例B
示例C
正如您所看到的,即使没有优化,A和B也会生成完全相同的代码,而C实际上有更多的指令(在我看来,可读性要差得多)!
该代码已在G++5.3下进行了分析,不同编译器的结果可能不同。要点是:这是一个微观(纳米?)优化。
通常预增量/预减量比后增量/后减量快,因为后-<>需要保存一个临时值以便返回。int可能不是这样,在int中,根据平台/编译器的不同,结果可能完全相同。在任何情况下,我都不期望预-<>比post-<>慢。
某些体系结构对"=="的性能优于对"大/小"的性能。(选项C)
作为最终答案:性能可能相似或相等,在某些特定情况下,最后一个可能更快。不利的一面是它的代码有点模糊,所以我推荐第二种选择。
这些循环的效率主要取决于的效率
// Do stuff.
实现。如果在编写循环的方式上存在显著的效率差异,那么整个循环很可能对整个程序的执行速度影响很小(因为只有当// Do stuff
只占循环总时间的一小部分时,才会发生这种情况)。
一般来说,除非你对代码进行了分析,并且你知道这样做真的很值得,否则你不应该优化任何东西
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 如何有效地在 std::vector 中插入一对?
- C++模板 t 不是有效的模板类型
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 将此布尔值传递给此函数的最有效方法是什么?