【发布时间】:2012-09-28 19:28:42
【问题描述】:
作为图像处理功能的一部分,我需要计算两者之间的平方和 图像中有两行。
这部分代码占用了 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++] 之类的东西替换 a[pa+dx]
性能也好不到哪里去。
执行保存运行的代码与用 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++ 代码一样快,最后还是相当简单易行 优化线条。
【问题讨论】:
-
由于 HotSpot,Java 中的性能测量并不容易。你是怎么测量的?
-
占用大部分时间的函数,如果删除这些行,代码几乎不会运行。
-
您可以尝试在热身中反复运行代码以允许优化启动。我无法告诉您多久,但可能大约 1.000 到 10.000 次。之后,您测量并查看是否有差异。
-
代码是温热 CPU 密集型,运行大约一分钟...
-
很难帮助任何人,因为我们无法对您提供的隔离 sn-p 进行基准测试,因此无法测试我们建议的任何方法是否更快。
标签: java optimization