【问题标题】:Wrappers of primitive types in arraylist vs arraysarraylist 与数组中原始类型的包装器
【发布时间】:2010-12-29 20:45:27
【问题描述】:

在我读过的“Core java 1”中

注意:ArrayList 距离很远 效率低于 int[] 数组 因为每个值都是分开的 包裹在一个物体里面。你会 只想将此构造用于 程序员时的小收藏 方便比方便更重要 效率。

但是在我的软件中,由于某些要求,我已经使用了 Arraylist 而不是普通数组,尽管“该软件应该具有高性能,在我阅读了引用的文字后,我开始感到恐慌!”我可以改变的一件事是将双变量更改为双,以防止自动装箱,我不知道这是否值得,在下一个示例算法中

public void multiply(final double val)
    {
        final int rows = getSize1();
        final int cols = getSize2();
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                this.get(i).set(j, this.get(i).get(j) * val);
            }
        }
    }

我的问题是将 double 更改为 Double 有什么不同吗?或者那是一个不会影响任何东西的微优化?请记住,我可能正在使用大型矩阵。第二我应该考虑重新设计整个程序吗?

【问题讨论】:

  • 警告是告诉你 ArrayList 与原始数组的效率,而代码示例两者都没有使用。
  • 该函数在一个扩展 ArrayList> 的类中
  • 一个小切线:final List&lt;Double&gt; row = this.get(i); for (int j = 0; j &lt; cols; j++) { row.set(j, row.get(j) * val); } 将总共检索每行一次,而不是每列两次,这可以大大加快您的代码速度,以获得相当小的和更易于阅读的更改。

标签: java performance optimization autoboxing


【解决方案1】:

doubleDouble 的最大问题是后者增加了一些内存开销——在 Sun 32 位 JVM 上每个对象 8 个字节,在其他 JVM 上可能或多或少。然后您需要另外 4 个字节(在 64 位 JVM 上为 8 个)来引用该对象。

因此,假设您有 1,000,000 个对象,差异如下:

double[1000000]

每个条目 8 个字节;总计 = 8,000,000 字节

Double[1000000]

每个对象实例 16 个字节 + 每个引用 4 个字节;总计 = 20,000,000 字节

这是否重要在很大程度上取决于您的应用程序。除非您发现自己的内存不足,否则请假设这无关紧要。

【讨论】:

    【解决方案2】:

    它改变了自动装箱发生的地方,但没有别的。

    第二个 - 不,不用担心这个。它不太可能成为瓶颈。您可以制定一些基准来衡量您的数据大小,以证明差异对于您的应用程序性能而言是微不足道的。

    【讨论】:

    • 除非您只使用 double ,否则不会发生自动装箱。 ;)
    • 是的,据我了解,他想将double 更改为Double 以防止自动装箱。而且它总是会发生,只是在另一个地方,因为他使用了一个列表。
    【解决方案3】:

    双倍比双倍贵得多,但在 90% 的情况下这并不重要。

    如果您想要一个高效的矩阵类,我建议您使用其中一个已经有效地做到这一点的库。例如贾玛。

    【讨论】:

      【解决方案4】:

      double 参数更改为Double 不会有太大帮助,它会稍微降低性能,因为它需要为乘法拆箱。

      有助于防止多次调用get(),如下所示:

          for (int i = 0; i < rows; i++)
          {
              List row = this.get(i);
      
              for (int j = 0; j < cols; j++)
              {
                  row.set(j, row.get(j) * val);
              }
          }
      

      (顺便说一句,我猜到了行的类型。)

      假设您使用列表列表,使用迭代器而不是通过循环索引获取和设置将获得更多性能。

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        相关资源
        最近更新 更多