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

标签 java performance optimization autoboxing

我读过《Core java 1》

CAUTION: An ArrayList is far less efficient than an int[] array because each value is separately wrapped inside an object. You would only want to use this construct for small collections when programmer convenience is more important than efficiency.

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

最佳答案

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

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

double[1000000]

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

Double[1000000]

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

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

关于java - arraylist 与数组中原始类型的包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557704/

相关文章:

performance - Nim 检查 :off vs -d:release

java - Android 支持 parseUnsignedLong 吗?

java - 为什么使用 Maven 和 Hibernate 设置一个简单的项目会失败?

performance - pgadmin4 打开数据库的空表非常慢

javascript - 分析性能敏感的代码路径

php - MYSQL PHP 一次查询跳转多张表

java - 枚举默认方法

java - 池化 NHttpClientConnectionManager : what is timeToLive attribute for?

JavaFX 滚动表更新性能随时间降低

matlab - 如何从另一个程序访问 MATLAB(插值)样条曲线?