因此,对于我的研究小组,我试图将一些旧的C++代码转换为Java,遇到一个问题,在C++代码中,它执行以下操作:
method(array+i, other parameters)
现在我知道Java不支持指针算法,所以我通过将子数组从array+i复制到数组的末尾到一个新的数组中来解决这个问题,但是这会导致代码运行得非常慢(即比C++版本慢100倍)。有办法绕过这件事吗?我看到有人在这里提到了一个内置的方法,但是这样更快吗?
发布于 2014-09-30 18:02:54
您的代码不仅变慢了,还改变了正在发生的事情的语义:当您在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++语义。
发布于 2014-09-30 18:02:46
C++函数可能从array
一开始就依赖于处理。在Java中,应该将其配置为从偏移量运行到数组中,这样就不需要复制数组了。复制数组,即使使用System.arraycopy
,也要花费大量的时间。
它可以定义为一个Java方法,如下所示:
void method(<somearraytype> array, int offset, other parameters)
然后,该方法将从偏移量处开始,并将其称为如下所示:
method(array, i, other parameters);
发布于 2014-09-30 18:02:58
如果希望将子数组传递给方法,则将子数组复制到新数组的替代方法是传递整个数组,并添加一个offset
参数,该参数指示数组的第一个相关索引。这将需要更改method
的实现,但是如果性能是一个问题,这可能是最有效的方法。
https://stackoverflow.com/questions/26127128
复制相似问题