我的代码要求我在每次调用函数时创建一个大的(301x301x19项)ArrayList,它有一些初始值(有些是0,有些是1等)。起始值总是相同的,每次调用函数时都需要加载到数组中,以便函数有自己的这些初始值的副本来处理。
最初我每次调用函数时都在重新计算数组,但事实证明这是可笑的慢;相反,我现在只计算一次初始数组,并且每次调用函数时都会对它进行局部复制(这样我就可以在不改变初始数组值的情况下更改值)。
然而,复制数组仍然被证明是非常慢的(只需要花费超过3/4的计算时间来复制这个数组)。我尝试过以下方法:
// oldList is an ArrayList<Byte>
ArrayList<Byte> newList = new ArrayList<Byte>(oldList);
// oldList is an ArrayList<Byte>
ArrayList<Byte> newList = new ArrayList<Byte>();
newList.addAll(oldList);
// oldList is a Byte[]
ArrayList<Byte> newList = new ArrayList<Byte>(Arrays.asList(oldList));
所有这些方法对我的应用来说都太慢了;有什么更快的技术可以做到这一点还是我运气不好?
答案 0 :(得分:4)
总结:
更改为更容易复制的数据结构,使用System.arraycopy的速度将与您在问题中概述的方法一样快。
System.arraycopy作为本机调用实现。大多数JVM提供程序都准备了一个本机版本,它使用本机指令来加速内存复制。
不幸的是,复制大面积的内存会在JVM中产生意想不到的副作用,主要是在垃圾收集器周围。
大型物体增加了GC周期中过早使用的可能性,这增加了更昂贵的老一代/完整GC的频率(与更便宜的年轻一代GC相对)