在我的代码中,我执行了大量任务,每个任务都需要大量内存来临时存储数据。我有大约 500 个任务。在每个任务开始时,我为一个数组分配内存:
double[] tempDoubleArray = new double[M];
M 是一个很大的数字,取决于精确的任务,通常在 2000000 左右。现在,我做了一些复杂的计算来填充数组,最后我使用数组来确定这个任务的结果。之后, tempDoubleArray 超出范围。
分析表明构造数组的调用非常耗时。因此,我决定尝试重用该数组,将其设为静态并重用它。它需要一些额外的杂耍来确定数组的最小大小,需要额外通过所有任务,但它确实有效。现在,程序要快得多(从 80 秒到 22 秒执行所有任务)。
double[] tempDoubleArray = staticDoubleArray;
但是,我有点不知道为什么它的效果如此之好。我说在原始代码中,当 tempDoubleArray 超出范围时,它可以被收集,所以分配一个新数组应该不是那么难吧?
我问这个是因为理解它为什么起作用可能会帮助我找出实现相同效果的其他方法,并且因为我想知道在什么情况下分配会产生性能问题。