当我运行以下程序时,执行大约需要7到8分钟。我真的不确定我错在哪里,因为这个程序花了很多时间来执行。
public class Test {
public static void main(String[] args) {
final Integer[] a= new Integer[1000000];
for (int i=0; i < a.length; i++) {
a[i] = i;
}
final List<Integer> source = Arrays.asList(a);
final Set<Integer> set = new CopyOnWriteArraySet<Integer>(source);
}
}
有人可以帮助我理解,为什么这个程序太慢了。
我的机器是带有4GB RAM的Core I7
答案 0 :(得分:6)
我已经测试过并且确实提供给构造函数的1 000 000个元素的列表,它需要很长时间(7分钟)。
这是关于Open JDK 2013-01-09的参考问题:
JDK-8005953 - CopyOnWriteArraySet copy constructor is unusable for large collections
问题将由CopyOnWriteArrayList#addAllAbsent()
构造函数调用的CopyOnWriteArraySet
方法引起。
问题摘录:
CopyOnWriteArraySet的复制构造函数对于大型来说太慢了 集合。只需要在开发者笔记本电脑上花费超过10分钟 要复制的集合中有100万个条目......
作为解决状态,您可以阅读:无法修复 你可以阅读上一条消息:
对于较大的输入,可以使addAllAbsent更快,但会影响 小尺寸的性能。并且记录了这一点 CopyOnWriteXXX类更适合小型集合 尺寸。
CopyOnWriteArraySet
javadoc确实指明了这一点:
最适合一般尺寸的应用 小型,只读操作数量远远超过变异操作,并且 你需要在遍历过程中防止线程之间的干扰。