首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“换循环”中使用“中断”对性能的影响

在“换循环”中使用“中断”对性能的影响
EN

Stack Overflow用户
提问于 2016-10-06 13:44:18
回答 2查看 2.1K关注 0票数 3

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

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

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

除了触发break (像if)的条件语句的额外代码之外,它还必须向我的循环添加额外的指令。 此外,当我的编译器试图展开for-loop时,它可能也会乱七八糟,因为它不再知道编译时将运行的迭代次数,从而有效地将其呈现为while-loop。 因此,我怀疑它确实会对性能产生影响,对于非常快速和紧凑的循环来说,这可能是相当大的。

所以这就带我去问一个后续问题。for-loop & break性能是否等于while-loop?与下面的片段一样,我们假设checkCondition()计算99.9%的时间为true。我是否失去了for-loop的性能优势?

代码语言:javascript
复制
// 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编译(我通常这样做),因为我对编译器的特定结果不感兴趣。我对这个概念本身相当感兴趣(在学术意义上),因为我不确定我是否完全正确:)

EN

回答 2

Stack Overflow用户

发布于 2016-10-06 13:49:58

主要的答案是避免花费时间在类似的微观优化上,直到您验证了这样的条件评估是一个瓶颈。

真正的答案是CPU有强大的分支预测电路,经验性很好。

会发生的情况是,CPU将选择是否要使用分支,并执行代码,就好像if条件甚至不存在一样。当然,这依赖于多个假设,比如不对状态计算产生副作用(因此身体循环的一部分依赖于它),并且这个条件将一直评估到错误,直到某个点它变为真并停止循环。

一些编译器还允许您将计算的可能性指定为分支预测器的提示。

如果您想了解这两个代码版本之间的语义差异,只需使用-S编译它们并检查生成的asm代码,那么就没有其他神奇的方法了。

票数 7
EN

Stack Overflow用户

发布于 2016-10-06 13:53:00

对于“.的业绩影响是什么”,唯一明智的答案是“衡量它”。没有几个通用的答案。

在您所展示的特定情况下,如果优化的编译器为这两个示例生成了显著不同的代码,这将是相当令人惊讶的。另一方面,我可以相信这样的循环:

代码语言:javascript
复制
unsigned sum = 0;
unsigned stop = -1;
for (int i = 0; i<32; i++)
{
    stop &= checkcondition();  // returns 0 or all-bits-set;
    sum += (stop & x[i]);
}

可能比以下速度更快:

代码语言:javascript
复制
unsigned sum = 0;
for (int i = 0; i<32; i++)
{
    if (!checkcondition())
        break;
    sum += x[i];
}

对于特定的编译器、特定的平台、设置了正确的优化级别,以及特定模式的“校验条件”结果。

..。但唯一能分辨的方法是测量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39897702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档