【问题标题】:Do 2D arrays use more resources than 1D arrays in Java?二维数组是否比 Java 中的一维数组使用更多资源?
【发布时间】:2009-02-23 18:45:05
【问题描述】:

例如,一个完整的 int[50][8] 会比 8 个完整的 int[50] 数组使用更多的资源(RAM 和 CPU)吗?

【问题讨论】:

  • 你有一些我们可以测试的代码示例吗?
  • 你想达到什么目的?如果您遇到性能问题,可能不是因为您组织数组的方式。

标签: java arrays resources cpu


【解决方案1】:

在第一种情况下,您有一个数组对象指向 50 个包含 8 个 int 的数组对象。 所以 1 + 50 个数组对象 + 第一个数组对象中有 50 个指针。

在第二种情况下,您有一个数组对象指向 8 个包含 50 个 int 的数组对象。 所以第一个数组对象中有 1 + 8 个数组对象 + 8 个指针。持有 int 是一种洗涤。

没有一个好的方法来评估 CPU 使用率。

【讨论】:

  • 那么,如果有的话,哪一个更适合 CPU?因为我的 Java 项目遇到了严重的 CPU 问题,我唯一能想到的就是数组。
  • @William:在尝试优化数组之前尝试分析器。你在用数组做什么?
【解决方案2】:

这里似乎要比较三件事。

  • new int[50][8]
  • new int[8][50]
  • new int[400]

现在,我对此感到困惑,但要记住的方法是考虑有效的new int[50][]

所以new int[50][8] 是一个包含 50 个大小为 8 的数组(51 个对象)的数组。 new int[8][50] 是一个由 8 个大小为 50 的数组(9 个对象)组成的数组。 9 个对象的开销将低于 51 个。new int[400] 只是一个对象。

但是,在这种大小下,它可能不会对您的程序的性能产生任何可衡量的影响。您可能希望将数组封装在一个对象中,这样您就可以更改实现并为客户端代码提供更自然的接口。

【讨论】:

  • 50 个对象中的每一个都缺少 8 个单独的数组。这一切都是为了存储 8 个变量列表,而不是 50 个。
  • 拥有一个对象的开销将比引用它的开销更大,无论是内存还是 CPU。
【解决方案3】:

一个额外的使用点(来自我现在找不到的参考资料,但相当常识)-

本文的作者正在测试将稀疏数组压缩为多维数组的各种方法。他们注意到的一件事是,迭代的速度会有所不同 -

这个想法是,如果你有 int[i][j] 这样做会更快

for (i) { 
     for (j)

不如做

for (j) { 
     for (i)

因为在第一个实例中,您要遍历连续存储的元素。

【讨论】:

  • 是的,即使对于“真正的”多维数组也是如此。
【解决方案4】:

您可以通过使用 int[] myInt = int[400] 数组来调整少量内存,并使用 myInt[x+y*50] 手动访问位置 (x,y) 处的 int 这将为您节省 50 块 32 位内存。以这种方式访问​​它可能会(谁知道热点编译器对此做了什么..)需要多一条指令来进行乘法运算。

这种微优化很可能不会使您的应用程序性能更好,并且会降低可读性。

【讨论】:

  • 我不是 Java 编译器方面的专家,但这似乎很容易,编译器可能会为您做任何事情。有人知道是不是这样吗?
【解决方案5】:

我建议为此使用非常大的数组编写一个小型性能测试,以查看实际差异。实际上,我认为这不会产生丝毫影响。

【讨论】:

    【解决方案6】:

    int[50][8] 是 50 个长度为 8 的数组 int[8][50] 是 8 个长度为 50 的数组 int[400] 是一个数组 400。 每个数组有大约 16 个字节的开销。

    但是,对于您在这里的尺寸,这并不重要。无论哪种方式,您都不会节省太多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 2012-04-13
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多