在“核心java 1”中,我读过

注意:阵列列表的效率远不如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);
            }
        }
    }

我的问题是,将双倍更改为两倍有可能有所作为吗?还是那是微观优化不会影响任何事情?请记住,我可能正在使用大型矩阵。2nd我应该考虑重新设计整个程序吗?

有帮助吗?

解决方案

大问题 double 相对 Double 是后者增加了一定数量的内存开销 - 在32位JVM上每个对象的每个对象8个字节,可能或多或少在其他对象上。然后,您需要另外4个字节(64位JVM上的8个字节)来参考对象。

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

double[1000000]

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

Double[1000000]

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

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

其他提示

它改变了自动氧化发生的位置,但别无其他。

和第二 - 不,不用担心。它不太可能成为瓶颈。您可以对数据的大小进行一些基准测量,以证明与应用程序性能有关的差异并不重要。

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

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

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

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

假设您使用列表列表,则使用迭代器而不是通过循环指数进行设置将赢得更多的性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top