我已经编写了一些模拟代码,并且正在使用“在 GDB 中随机中断”的调试方法。我发现我的程序 99.9% 的时间都花在了这个例程中(这是最小的图像约定):
inline double distanceSqPeriodic(double const * const position1, double const * const position2, double boxWidth) {
double xhw, yhw, zhw, x, y, z;
xhw = boxWidth / 2.0;
yhw = xhw;
zhw = xhw;
x = position2[0] - position1[0];
if (x > xhw)
x -= boxWidth;
else if (x < -xhw)
x += boxWidth;
y = position2[1] - position1[1];
if (y > yhw)
y -= boxWidth;
else if (y < -yhw)
y += boxWidth;
z = position2[2] - position1[2];
if (z > zhw)
z -= boxWidth;
else if (z < -zhw)
z += boxWidth;
return x * x + y * y + z * z;
}
到目前为止我执行的优化(可能不是很重要):
- 返回距离的平方而不是平方根
- 内联它
- 尽我所能
- 没有标准库膨胀
- 使用我能想到的每个 g++ 优化标志进行编译
我已经没有什么可以做的了。也许我可以使用浮点数而不是双精度数,但我希望这是最后的手段。也许我可以以某种方式使用 SIMD,但我从来没有这样做过,所以我想这是很多工作。有任何想法吗?
谢谢