System.arraycopy性能

时间:2019-06-19 12:12:02

标签: java arrays performance memory-management

我在自己的应用程序中面临着具有挑战性的内存问题。我想解决内存泄漏问题,所以我不想创建太多的对象和数组,而是要重用最近分配的内存(使用对象和数组池)。

在我的一种情况下,我想将已分配数组的单元格向右移特定长度。为此,我实现了以下简单解决方案:

private void shiftRight(int length) {
    for (int index = size + length - 1; index >= length; index--) {
        bytes[index] = bytes[index - length];
    }
}

当我搜索这个问题时,我发现我可以使用System.arraycopy代替我的简单解决方案。

System.arraycopy(bytes, 0, bytes, length, size);

但是我担心System.arraycopy的性能。如该方法的文档所述:

  

如果src和dest参数引用相同的数组对象,则   就像执行srcPos位置上的组件一样执行复制   srcPos + length-1首先被复制到具有length的临时数组中   组件,然后复制临时数组的内容   通过目标的destPos + length-1进入位置destPos   数组。

此方法使用临时数组从src复制到dest。我认为这种方法会在高事务系统中创建太多数组,从而导致新的性能问题。

能否请您讨论这两种解决方案?

谢谢。

1 个答案:

答案 0 :(得分:3)

句子中的关键词是“好像”。它实际上并没有使用临时数组。描述只是说它像 一样工作(换句话说,它不会覆盖本不应该的东西)。

您可能想比较System.arraycopy与for循环的性能,因为我相信我在某处看到for循环对于较短的数组可以更快。

请参见Is Java's System.arraycopy() efficient for small arrays?