我已经尽了最大的努力,在SO.SE上读了很多问题,但是我还没有找到我的问题的答案。大多数与for-loop和break相关的问题都涉及嵌套循环,而我关注的是性能。
我想知道在break for-loop 中使用是否会对C++代码的性能产生影响(假设中断几乎从未被调用)。如果有,我也想试探性地知道惩罚有多大。。
我很怀疑它确实会影响性能(虽然我不知道影响了多少)。所以我想问你。我的理由如下:
除了触发
break(像if)的条件语句的额外代码之外,它还必须向我的循环添加额外的指令。 此外,当我的编译器试图展开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;
}
}我已经在我的电脑上试过了,但是我有相同的执行时间。我对编译器和它的优化伏都教保持警惕,我想知道概念上的答案。
编辑:
请注意,我已经在我的完整代码中测量了两个版本的执行时间,没有任何真正的区别。而且,我不信任使用-s编译(我通常这样做),因为我对编译器的特定结果不感兴趣。我对这个概念本身相当感兴趣(在学术意义上),因为我不确定我是否完全正确:)
发布于 2016-10-06 13:49:58
主要的答案是避免花费时间在类似的微观优化上,直到您验证了这样的条件评估是一个瓶颈。
真正的答案是CPU有强大的分支预测电路,经验性很好。
会发生的情况是,CPU将选择是否要使用分支,并执行代码,就好像if条件甚至不存在一样。当然,这依赖于多个假设,比如不对状态计算产生副作用(因此身体循环的一部分依赖于它),并且这个条件将一直评估到错误,直到某个点它变为真并停止循环。
一些编译器还允许您将计算的可能性指定为分支预测器的提示。
如果您想了解这两个代码版本之间的语义差异,只需使用-S编译它们并检查生成的asm代码,那么就没有其他神奇的方法了。
发布于 2016-10-06 13:53:00
对于“.的业绩影响是什么”,唯一明智的答案是“衡量它”。没有几个通用的答案。
在您所展示的特定情况下,如果优化的编译器为这两个示例生成了显著不同的代码,这将是相当令人惊讶的。另一方面,我可以相信这样的循环:
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]);
}可能比以下速度更快:
unsigned sum = 0;
for (int i = 0; i<32; i++)
{
if (!checkcondition())
break;
sum += x[i];
}对于特定的编译器、特定的平台、设置了正确的优化级别,以及特定模式的“校验条件”结果。
..。但唯一能分辨的方法是测量。
https://stackoverflow.com/questions/39897702
复制相似问题