4

在“Core java 1”中我读过

注意: ArrayList 的效率远低于 int[] 数组,因为每个值都单独包装在一个对象中。当程序员的便利性比效率更重要时,您只会希望将此构造用于小型集合。

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

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 有什么不同吗?或者那是一个不会影响任何东西的微优化?请记住,我可能正在使用大型矩阵。第二我是否应该考虑重新设计整个程序?

4

4 回答 4

4

doublevs的最大问题Double是后者增加了一些内存开销——在 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 字节

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

于 2010-12-29T20:55:23.730 回答
1

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

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

于 2010-12-29T20:49:58.760 回答
1

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

如果您想要一个高效的矩阵类,我建议您使用已经有效执行此操作的库之一。例如贾马。

于 2010-12-29T20:50:27.410 回答
0

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);
        }
    }

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

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

于 2010-12-29T21:06:37.337 回答