我有以下while
-loop
uint32_t x = 0;
while(x*x < STOP_CONDITION) {
if(CHECK_CONDITION) x++
// Do other stuff that modifies CHECK_CONDITION
}
STOP_CONDITION
在运行时是常量,但在编译时不是常量。有没有更有效的方法来维护x*x
或我真的需要每次重新计算它? 最佳答案
注意:根据下面的benchmark,此代码的运行速度比this option慢约1-2%。请阅读底部的免责声明!
除了Tamas Ionut的答案外,如果您希望将STOP_CONDITION
保持为实际的停止条件并避免平方根计算,则可以使用数学标识更新平方
(x + 1)² = x² + 2x + 1
每当您更改
x
时:uint32_t x = 0;
unit32_t xSquare = 0;
while(xSquare < STOP_CONDITION) {
if(CHECK_CONDITION) {
xSquare += 2 * x + 1;
x++;
}
// Do other stuff that modifies CHECK_CONDITION
}
由于
2*x + 1
只是一个位移和一个增量,因此编译器应该能够很好地对其进行优化。免责声明:由于您询问“如何优化此代码”,我以一种特殊的方式进行了回答,以使其变得更快。实际上,应该检验double +增量是否比单个整数乘法快。是否应该优化代码是另一个问题。我认为您已经对循环进行了基准测试,发现它是瓶颈,或者您对该问题有理论兴趣。如果您要编写要优化的生产代码,请首先测量性能,然后在需要的地方进行优化(此循环中可能不是
x*x
)。