Java 热点环路优化-特定示例

Java 热点环路优化-特定示例,java,performance,optimization,Java,Performance,Optimization,下面是我正在开发的算法中最昂贵的部分。 绝对是一个热点,到目前为止-通过VisualVM检查。 这已经在一些优化技巧之后了,比如展开3ds行。 当然,GAUSS\u POINT\u WEIGHTS有一个固定数量的元素等于10,我们也可以尝试展开它,但这会产生100个可能的组合,所以我不确定它是否值得(也许JIT无论如何都能完成这项工作) b1、b2和b3与主循环(b样条曲线)中的功能相同。也许我可以从外面传过去,但值得吗 在我看来,没有什么可以做的,但也许你能发现一些值得做的事情?如果做某事有任

下面是我正在开发的算法中最昂贵的部分。 绝对是一个热点,到目前为止-通过VisualVM检查。 这已经在一些优化技巧之后了,比如展开3
ds
行。 当然,
GAUSS\u POINT\u WEIGHTS
有一个固定数量的元素等于10,我们也可以尝试展开它,但这会产生
100个可能的组合,所以我不确定它是否值得(也许JIT无论如何都能完成这项工作)

b1、b2和b3与主循环(b样条曲线)中的功能相同。也许我可以从外面传过去,但值得吗


在我看来,没有什么可以做的,但也许你能发现一些值得做的事情?如果做某事有任何先决条件,请告诉我。

展开100次是非常疯狂的,因为您的代码已经相当长了。我敢打赌在那里没有什么好处。相反,;有一次,我仅仅通过点击“提取方法”就获得了巨大的加速(接近2倍)

您可以从一个循环中提升
wk
gk
初始化

通过提取
wk*wl
,您可能可以避免一些乘法运算,但我敢打赌它一定是紧张的

您可以通过拆分第一次迭代和最后一次迭代来避免这些条件

您可以在局部变量中缓存一些值(例如,
b3.getValue(gk)

那只是猜测而已。不管怎样,我先从提取最外层环路的主体开始,然后测量是否有速度差。我希望它不会变得更糟,然后您可以轻松地提取第一个和最后一个迭代

对于中间迭代,有

val y = (gl + (i - 2)) * dy;
...
val y = (gl + (i - 1)) * dy;
...
val y = (gl + i) * dy;
可以增量计算。JIT(很可能)会对整数执行此操作,但不会对浮点执行此操作,因为它并不完全相同。你的
val
,我不知道是哪种情况

然后,您可以将对
ds.add(0,i,…)
的三个调用聚合为
ds.add(0,i,b3.getValue(gk)*(v+v'+v'')
,并从
三个
if
s.

感谢您提供的详细答案。它已经显示出一些改进,但现在主要关注的是内部调用的方法。您是否也可以快速查看该方法(编辑的问题)?
private double internalValueAt(double x, double y) {
    val ielemx = (long) (x / mesh.getDx());
    val ielemy = (long) (y / mesh.getDy());
    val localx = x - mesh.getDx() * ielemx;
    val localy = y - mesh.getDy() * ielemy;

    val sp1x = b1.getValue(localx);
    val sp1y = b1.getValue(localy);
    val sp2x = b2.getValue(localx);
    val sp2y = b2.getValue(localy);
    val sp3x = b3.getValue(localx);
    val sp3y = b3.getValue(localy);

    return coef.doubleValue(0, ielemy) * sp1x * sp1y +
        coef.doubleValue(0, ielemy + 1) * sp1x * sp2y +
        coef.doubleValue(0, ielemy + 2) * sp1x * sp3y +
        coef.doubleValue(1, ielemy) * sp2x * sp1y +
        coef.doubleValue(1, ielemy + 1) * sp2x * sp2y +
        coef.doubleValue(1, ielemy + 2) * sp2x * sp3y +
        coef.doubleValue(2, ielemy) * sp3x * sp1y +
        coef.doubleValue(2, ielemy + 1) * sp3x * sp2y +
        coef.doubleValue(2, ielemy + 2) * sp3x * sp3y;
  }
val y = (gl + (i - 2)) * dy;
...
val y = (gl + (i - 1)) * dy;
...
val y = (gl + i) * dy;