目前我正在编写一个依赖于Adams-Bashforth方程进行数值积分的程序:
void foo::simStep(double dt)
{
// Prepare integration
static unsigned long long int curCycle = 0;
if(curCycle >= 2)
{
// Adams-Bashforth 3rd order
stateArray += dt * (23.0 / 12.0 * statepArray.block<13, 1>(0, 0) -
4.0 / 3.0 * statepArray.block<13, 1>(0, 1) +
5.0 / 12.0 * statepArray.block<13, 1>(0, 2));
}
else if (curCycle == 1)
{
// Adams-Bashforth 2nd order
stateArray += dt * (3.0 / 2.0 * statepArray.block<13, 1>(0, 0) -
1.0 / 2.0 * statepArray.block<13, 1>(0, 1));
}
else
{
// Adams-Bashforth 1st order (Euler)
stateArray += dt * statepArray.block<13, 1>(0, 0);
}
++curCycle;
// Calculate and set the outputs
}
这部分代码将以160Hz调用,因此分支错误预测的影响将非常高。
正如你所看到的那样,只有一次调用一阶和二阶方程(只要curCycle没有溢出),之后它总是第三个(第一个if)。
有没有更好的方法来处理这些问题?或者分支预测总是很好地预测这样的&#34; easy&#34;东西?