gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:43 25 4
gpt4 key购买 nike

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

这部分代码占用了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com