阵列与数组中原始类型的包装器
-
14-10-2019 - |
题
在“核心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);
}
}
(顺便说一句,我猜到了行的类型。)
假设您使用列表列表,则使用迭代器而不是通过循环指数进行设置将赢得更多的性能。