在“Core 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会有所作为吗?或者这是微观优化,不会影响任何事情?请记住,我可能正在使用大型矩阵。我应该考虑重新设计整个程序吗?
答案 0 :(得分:4)
double
与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字节
这是否重要在很大程度上取决于您的申请。除非你发现自己内存不足,否则假设没关系。
答案 1 :(得分:1)
它改变了自动装箱发生的地方,但没有别的。
第二 - 不,不要担心这个。它不太可能成为瓶颈。您可以根据数据大小进行一些基准测试,以证明在应用程序性能方面差异不大。
答案 2 :(得分:1)
Double比双倍大得多,但在90%的情况下并不重要。
如果你想要一个有效的矩阵类,我建议你使用其中一个已经有效地完成这项工作的库。例如贾马。
答案 3 :(得分: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);
}
}
(顺便说一下,我猜到了行的类型。)
假设您使用列表列表,使用迭代器而不是geting并通过循环索引设置将获得更多性能。