我有以下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)。

09-30 15:47