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或我真的需要每次都重新计算?
注意:根据下面的基准测试,此代码比此选项慢约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在此循环中).