我已尽最大努力并阅读了很多关于 SO.SE 的问答,但我还没有找到我的特定问题的答案。大多数 for-loopbreak 相关问题都涉及嵌套循环,而我关心的是性能。

我想知道在 break 中使用 for-loop 是否会影响我的 C++ 代码的性能(假设几乎从未调用过中断)。如果有,我也想暂时知道惩罚有多大。

我很怀疑它确实会影响性能(虽然我不知道影响有多大)。所以想问问你。我的推理如下:



所以这把我带到了一个后续问题。 for-loopbreak 性能方面是否等于 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/

10-13 08:21