假设您要计算项目差异的平方和:
$\sum_{i=1}^{N-1} (x_i - x_{i+1})^2$
最简单的代码(输入是 std::vector<double> xs
,输出sum2
)是:
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (prev - (*i)) * (prev - (*i)); // only 1 - with compiler optimization
prev = (*i);
}
我希望编译器在上面的评论中做优化。如果N
是xs
你有N-1
乘法和2N-3
总和的长度(总和意味着+
或-
)。
现在假设你知道这个变量:
$x_1^2 + x_N^2 + 2 \sum_{i=2}^{N-1} x_i^2$
并调用它sum
。展开二项式平方:
$sum_i^{N-1} (x_i-x_{i+1})^2 = sum
- 2\sum_{i=1}^{N-1} x_i x_{i+1}$
所以代码变成:
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (*i) * prev;
prev = (*i);
}
sum2 = -sum2 * 2. + sum;
在这里,我有N 次乘法和 N-1 次加法。在我的情况下,N 约为 100。
好吧,用我编译g++ -O2
没有加速(我尝试调用内联函数 2M 次),为什么?