首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化Java数组拷贝

优化Java数组拷贝
EN

Stack Overflow用户
提问于 2014-09-30 17:58:47
回答 4查看 221关注 0票数 1

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

代码语言:javascript
运行
复制
    method(array+i, other parameters)

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-30 18:02:54

您的代码不仅变慢了,还改变了正在发生的事情的语义:当您在C++中调用时,没有执行数组复制,因此method可能应用于数组的任何更改都发生在原始的,而不是在丢弃的副本中。

为了在Java中实现同样的效果,更改函数的签名如下:

代码语言:javascript
运行
复制
void method(array, offset, other parameters)

现在调用方必须传递数组中的位置,method应该考虑数组的“虚拟零”。换句话说,与其写类似的东西

代码语言:javascript
运行
复制
for (int i = 0 ; i != N ; i++)
    ...

你得写

代码语言:javascript
运行
复制
for (int i = offset ; i != offset+N ; i++)
    ...

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

票数 6
EN

Stack Overflow用户

发布于 2014-09-30 18:02:46

C++函数可能从array一开始就依赖于处理。在Java中,应该将其配置为从偏移量运行到数组中,这样就不需要复制数组了。复制数组,即使使用System.arraycopy,也要花费大量的时间。

它可以定义为一个Java方法,如下所示:

代码语言:javascript
运行
复制
void method(<somearraytype> array, int offset, other parameters)

然后,该方法将从偏移量处开始,并将其称为如下所示:

代码语言:javascript
运行
复制
method(array, i, other parameters);
票数 2
EN

Stack Overflow用户

发布于 2014-09-30 18:02:58

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26127128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档