java - Java 中的 vector 距离计算 - 优化

标签 java optimization

作为图像处理函数的一部分,我需要计算两者之间的平方和 图像中的两条线。

这部分代码占用了 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[]
  • 类型
  • sumlong
  • sizeint 并且通常有很大的值(大约 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++ 代码一样快,最后它非常简单易行 优化线路。

最佳答案

它只是很小,但您不需要 & 0xFF 来计算差异:差异 将是相同的有符号或无符号。

100 - -1 = 101  // signed
228 - 127 = 101 // unsigned

那么循环体会更紧:

for (int dx = 0; dx < size; dx++) {
    int diff = a[pa+dx] - b[pb+dx];
    sum += diff*diff;
}

编辑:

关于有符号和无符号字节运算似乎有些混淆。如果您怀疑它们是否相同,请执行此命令:

byte a = -128;
byte b = 127;
int diff = a - b;
System.out.println(diff); // -255

a = 127;
b = -128;
diff = a - b;
System.out.println(diff); // 255

原因 diff 值的范围大于byte (-128..127),是java自动将byte扩展为int 计算之前,因为目标变量是 int

关于java - Java 中的 vector 距离计算 - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646186/

相关文章:

excel vba内存使用优化

image - PNG 压缩

sql-server - 优化性能不佳的查询需要采取哪些步骤?

java - 如何从 Maven 中的父项目中排除依赖项?

java - 将 java 对象转换为具有已知类型参数的泛型类型

java - 将列表转换为 JSON

python+MySQLdb, simple select 相比平面文件访问速度太慢

java - 如何在电子邮件正文中嵌入图像 - Android

java - 将 Toast 与 BufferedReader 一起使用

javascript - 对 JSON 数据进行排序并获取前 n 条记录