CopyOnWriteArraySet太慢了

时间:2017-06-03 15:21:13

标签: java

当我运行以下程序时,执行大约需要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

1 个答案:

答案 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确实指明了这一点:

  

最适合一般尺寸的应用   小型,只读操作数量远远超过变异操作,并且   你需要在遍历过程中防止线程之间的干扰。