and*_*ora 3 c++ performance for-loop while-loop
我已经尽了最大努力,并在SO.SE上阅读了很多问答,但我没有找到我的特定问题的答案.大多数for-loop和break相关的问题是指嵌套循环,而我关心的性能.
我想知道使用break内部for-loop是否会对我的C++代码的性能产生影响(假设几乎从未调用过break).如果有的话,我也想暂时知道惩罚有多大.
我很怀疑它确实会影响性能(虽然我不知道多少).所以我想问你.我的推理如下:
与触发
break(如aif)的条件语句的额外代码无关,它必然会向我的循环添加其他指令.此外,当我的编译器试图展开时,它可能也会混乱
for-loop,因为它不再知道将在编译时运行的迭代次数,有效地将其渲染为while-loop.因此,我怀疑它确实会对性能产生影响,这对于非常快速和紧凑的循环来说可能是相当大的.
所以这让我想到了一个后续问题.一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的电脑上试过它,但是我得到了相同的执行时间.并且对编译器及其优化巫术保持警惕,我想知道概念性的答案.
编辑:
请注意,我已经在完整代码中测量了两个版本的执行时间,没有任何实际区别.另外,我不相信-s为此事编译(我通常这样做),因为我对编译器的特定结果不感兴趣.我对这个概念本身很感兴趣(在学术意义上)因为我不确定我是否完全正确:)
主要答案是避免花时间进行类似的微观优化,直到您确认此类条件评估是瓶颈为止.
真正的答案是CPU具有强大的分支预测电路,这些电路在经验上非常有效.
会发生什么是你的CPU将选择是否要采用分支并执行代码,好像if条件不存在一样.当然,这依赖于多种假设,例如对条件计算没有副作用(因此身体循环的一部分取决于它),并且该条件将始终评估为假,直到它将变为真的某一点.停止循环.
一些编译器还允许您指定评估的可能性作为提示分支预测器.
如果你想看到两个代码版本之间的语义差异,只需编译它们-S并检查生成的asm代码,就没有其他神奇的方法可以做到这一点.