作为图像处理功能的一部分,我需要计算图像中两条线之间的平方和。
这部分代码占用了 96% 的运行时间:
for(int dx=0;dx<size;dx++) {
int left = a[pa+dx];
int right = b[pb+dx];
int diff = (left & 0xFF) - (right & 0xFF);
sum += diff*diff;
}
在哪里:
a
,b
是类型byte[]
sum
是long
size
是int
并且通常具有很大的值(大约 400)
运行 Java 7 64 位。我试图用
性能不是更好的a[pa+dx]
东西来代替。a[pa++]
完全相同的用 C++ 编写的代码完全保存运行速度总体快了两倍(!),据我所知,应该没有重要的原因为什么这个 Java 代码不会那么快,特别是当边界检查可以移出时编译器的循环。
如何优化这些东西以像 C++ 代码一样执行 - 最后它是整数运算,它在 Java 中应该不会慢很多
编辑:C++ 示例如下所示:
unsigned char const *srcptr=&a[pa];
unsigned char const *tgtptr=&b[pb];
for(int dx=0;dx < size;dx++) {
int p1=*srcptr++;
int p2=*tgtptr++;
int diff = p1 - p2;
sum += diff * diff;
}
我想了解如何使 HotSpot 优化器创建与上面显示的 C++ 代码一样快的代码,最后优化行非常简单易行。