优化Java阵列复制

时间:2014-09-30 17:58:47

标签: java arrays

因此,对于我的研究小组,我试图将一些旧的C ++代码转换为Java,并且遇到了一个问题,在C ++代码中它执行以下操作:

    method(array+i, other parameters)

现在我知道Java不支持指针算法,所以我通过将数组+ i中的子数组复制到数组末尾到新数组来解决这个问题,但这会导致代码运行速度非常慢(即速度慢100倍)比C ++版本)。有办法解决这个问题吗?我看到有人在这里提到了内置方法,但是更快吗?

4 个答案:

答案 0 :(得分:6)

您的代码不仅变慢,而且还会改变正在发生的语义:当您使用C ++进行调用时,不会进行任何数组复制,因此method可能对数组应用的任何更改都是发生在原件中,而不是丢弃的副本。

要在Java中实现相同的效果,请更改函数的签名,如下所示:

void method(array, offset, other parameters)

现在调用者必须传递method应该考虑"虚拟零"的数组中的位置。数组。换句话说,而不是写

之类的东西
for (int i = 0 ; i != N ; i++)
    ...

你必须写

for (int i = offset ; i != offset+N ; i++)
    ...

这将保留将数组传递给成员函数的C ++语义。

答案 1 :(得分:2)

C ++函数可能依赖于array开头的处理。在Java中,它应该被配置为从偏移量运行到数组中,因此不需要复制数组。即使使用System.arraycopy,复制数组也会花费大量时间。

可以将它定义为类似这样的Java方法:

void method(<somearraytype> array, int offset, other parameters)

然后该方法将从数组的偏移处开始,并且它将被调用如下:

method(array, i, other parameters);

答案 2 :(得分:0)

如果您希望将子数组传递给方法,则将子数组复制到新数组的替代方法是使用额外的offset参数传递整个数组,该参数指示第一个相关索引数组。这需要更改method的实施,但如果性能是一个问题,那可能是最有效的方式。

答案 3 :(得分:0)

处理此问题的正确方法是重构方法,进行签名

method(int[] array, int i, other parameters)

以便传递整个数组(通过引用),然后告诉方法从哪里开始处理。那你就不需要复制了。