Java 直接访问阵列的一部分 < >为了加速我的图像处理应用程序,我试图解决数组中的值,从中间开始,使用从0开始的索引。

Java 直接访问阵列的一部分 < >为了加速我的图像处理应用程序,我试图解决数组中的值,从中间开始,使用从0开始的索引。,java,arrays,Java,Arrays,例如,当我使用两个阵列时,我经常遇到如下情况: public void work(int[] array1, int[] array2, int offset) { int len = array1.length; for (int i = 0; i < len; i++) array1[i] += array2[i + offset]; } 注意:我没有任何使用JNI或任何东西的经验,因此如果归结为使用JNI,请提供工作示例。使用纯Java数组和数组[i

例如,当我使用两个阵列时,我经常遇到如下情况:

public void work(int[] array1, int[] array2, int offset)
{
    int len = array1.length;
    for (int i = 0; i < len; i++)
        array1[i] += array2[i + offset];
}

注意:我没有任何使用JNI或任何东西的经验,因此如果归结为使用JNI,请提供工作示例。

使用纯Java数组和
数组[index]
符号是不可能做到这一点的。在Java数组中,不能重叠

但是,您可以将数组封装在中。如果你使用一个(见)你应该得到真正好的表现

声明,如

int *array3ptr = array2ptr + offset;
将写为

IntBuffer array3 = array2.slice().position(offset);

在java中,偶数整数数组是堆上的对象。因此int[]array2实际上直接引用内存中的整数数组。没有创建对象(即数组)的副本,副本只是对数组的引用。

我对它们没有太多经验,但我认为您可以通过包装数组(和子数组)来做到这一点进入实例。

我在某个地方读到,JNI应该可以使用
IntBuffer
或something@Zom-B我不这么认为。数组是需要由纯Java或JNI创建的实际对象。即使您可以重复使用数据区域,您仍然需要创建一个带有长度字段等的新对象。IMO唯一有效且优雅的方法是更改您的API,以便除了数组之外,它还可以接受开始和结束索引,或者使用
ByteBuffer
和friends,直接缓冲区只有在您将数据移动到某个位置(磁盘、网络)时,而不仅仅是在内存中操作数据时,才能给您带来性能提升。但当然,如果您处理的内容包括从磁盘读取、操作、写回,那么直接缓冲区会有所帮助。太糟糕了。我不是把数据作为一个整体来处理,而是在像素级(像素中的单个颜色)来处理数据。查看DirectByteBuffer的源代码,我看到get方法检查是否超出范围,计算索引并从不安全的对象获取值。这只能比数组[x+变量]慢几个数量级。在得出结论之前,请尝试一下。数组[x+变量]还执行.array绑定检查。这是当前的性能问题吗?您希望替换循环中的单个add?
int *array3ptr = array2ptr + offset;
IntBuffer array3 = array2.slice().position(offset);