【问题标题】:System.arraycopy performanceSystem.arraycopy 性能
【发布时间】:2019-11-02 04:11:33
【问题描述】:

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

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

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 首先被复制到一个临时数组中,长度为 组件,然后复制临时数组的内容 通过目标的 destPos+length-1 进入位置 destPos 数组。

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

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

提前致谢。

【问题讨论】:

  • 你能不能试试看性能是否可以接受?
  • 在高负载下实施和测试解决方案对我来说有时间成本。因此,根据文档,它似乎存在性能问题。
  • 这对您有帮助吗? stackoverflow.com/questions/18638743/…
  • “我想解决内存泄漏问题...” - 如果您真的是指内存泄漏,那么(IMO)您正在以错误的方式解决问题.使用内存配置文件来追踪泄漏的来源。这比重写代码以最小化对象分配要少得多。

标签: java arrays performance memory-management


【解决方案1】:

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

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

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

【讨论】:

  • 我们不能 100% 确定它不会创建临时数组。我们所知道的是它是一个本地方法,但是没有什么可以阻止本地实现创建一个临时数组。
  • 如果我们检查本机方法的源代码(不难!),我们可以 100% 确定。我们可以在不检查的情况下确定 99.9%,因为 确实 使用临时数组的实现将在 > 20 年前被优化/修复。 (除非你在谈论一个实验性的 JVM ......由不太关心性能的人编写。)
  • @Stephen C 是 - 99.9%。本案例涵盖了 0.1%:dilbert.com/strip/2009-08-30.
  • @maaartinus 通常内在 == 本机。
  • @maaartinus - 我的理解是native 和“内在”是正交的。但这取决于您的意思是“本机”是指在本机代码中实现还是使用 native 关键字声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多