繁体   English   中英

arraylist与数组中原始类型的包装

[英]Wrappers of primitive types in arraylist vs arrays

在“核心java 1”我读过

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

但是在我的软件中,由于一些要求,我已经使用了Arraylist而不是普通的阵列,尽管“该软件应该具有高性能,在我阅读引用的文本后,我开始恐慌!” 我可以改变的一件事是将双变量更改为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会有所不同吗? 或者这是微观优化,不会影响任何事情? 请记住,我可能正在使用大型矩阵。我应该考虑重新设计整个程序吗?

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字节

这是否重要在很大程度上取决于您的申请。 除非你发现自己内存不足,否则假设没关系。

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

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

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

如果你想要一个有效的矩阵类,我建议你使用其中一个已经有效地完成这项工作的库。 例如贾马

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM