我已尽最大努力并阅读了很多关于 SO.SE 的问答,但我还没有找到我的特定问题的答案。大多数 for-loop
和 break
相关问题都涉及嵌套循环,而我关心的是性能。
我想知道在 break
中使用 for-loop
是否会影响我的 C++ 代码的性能(假设几乎从未调用过中断)。如果有,我也想暂时知道惩罚有多大。
我很怀疑它确实会影响性能(虽然我不知道影响有多大)。所以想问问你。我的推理如下:
所以这把我带到了一个后续问题。 for-loop
和 break
性能方面是否等于 while-loop
?就像在下面的代码片段中一样,我们假设 checkCondition()
在 99.9% 的时间内评估为 true
。我会失去 for-loop
的性能优势吗?
// USING WHILE
int i = 100;
while( i-- && checkCondition())
{
// do stuff
}
// USING FOR
for(int i=100; i; --i)
{
if(checkCondition()) {
// do stuff
} else {
break;
}
}
我已经在我的电脑上试过了,但我得到了相同的执行时间。并且对编译器及其优化巫术保持警惕,我想知道概念上的答案。
编辑:
请注意,我在完整代码中测量了两个版本的执行时间,没有任何实际差异。此外,我不相信使用
-s
(我通常会这样做)进行编译,因为我对编译器的特定结果不感兴趣。我对这个概念本身很感兴趣(在学术意义上),因为我不确定我是否完全正确:) 最佳答案
主要的答案是避免在类似的微优化上花费时间,直到您确认此类条件评估是瓶颈。
真正的答案是 CPU 具有强大的分支预测电路,凭经验可以很好地工作。
将会发生的情况是,您的 CPU 将选择是否采用分支并执行代码,就好像 if 条件不存在一样。当然,这依赖于多个假设,例如对条件计算没有副作用(因此主体循环的一部分取决于它)并且该条件将始终评估为假,直到某个点变为真并且停止循环。
一些编译器还允许您指定评估的可能性作为分支预测器的提示。
如果您想查看两个代码版本之间的语义差异,只需使用 -S
编译它们并检查生成的 asm 代码,没有其他神奇的方法可以做到这一点。
关于c++ - 在 'break' 中使用 'for-loop' 的性能影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39897702/