用C++维护x*x

Ynk*_*kDK 4 c++ math optimization c++11

我有以下while-loop

uint32_t x = 0;
while(x*x < STOP_CONDITION) {
    if(CHECK_CONDITION) x++
    // Do other stuff that modifies CHECK_CONDITION
}
Run Code Online (Sandbox Code Playgroud)

STOP_CONDITION在运行时是常量,但不是在编译时.是否有更有效的维护方法x*x或我真的需要每次都重新计算?

Com*_*hip 9

注意:根据下面的基准测试,此代码比此选项慢约1 - 2%.请阅读底部的免责声明!


除了Tamas Ionut的答案,如果你想保持STOP_CONDITION实际停止条件并避免平方根计算,你可以使用数学身份更新方块

(x + 1)² = x² + 2x + 1
Run Code Online (Sandbox Code Playgroud)

每当你改变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
}
Run Code Online (Sandbox Code Playgroud)

由于2*x + 1只是一点点移位和增量,编译器应该能够很好地优化它.

免责声明:既然你问:"我怎么可以优化这段代码"我回答一个特定的方式可能使其更快.实际上应该测试double +增量实际上是否比单个整数乘法更快.是否应该优化代码是一个不同的问题.我假设你已经对循环进行了基准测试并发现它是一个瓶颈,或者你对这个问题有理论上的兴趣.如果您正在编写希望优化的生产代码,请首先测量性能,然后在需要的地方进行优化(可能不是x*x在此循环中).

  • @YnkDK是的,但正如我在答案中强调的那样,MM也在评论中指出,你应该真正测量这一点,看看你没有完全牺牲代码的可读性.我相当确定没有编译器会使用乘法和加法执行`2*x + 1`. (3认同)
  • 值得对此进行分析:你已经用乘法和加法替换了一个乘法!如今,CPU在整数乘法中非常快. (2认同)