性能问题 - 清除并重用一个集合或抛出它并获得一个新集合

时间:2012-04-17 19:40:38

标签: java performance

假设我们尝试实现一个合并排序算法,给定一个数组数组来合并一个更好的方法,这个:

public void merge(ArrayList<ArrayList<E>> a) {
    ArrayList<ArrayList<E>> tmp = new ArrayList<ArrayList<E>>() ;
    while (a.size()>1) {
        for (int i=1; i<a.size();i+=2) {
            tmp.add(merge(a.get(i-1),a.get(i)));
        }
        if (a.size()%2==1) tmp.add(a.get(a.size()-1));
        a = tmp;
        tmp = new ArrayList<ArrayList<E>>() ;
    }
}

或者这个:

public void merge(ArrayList<ArrayList<E>> a) {
    ArrayList<ArrayList<E>> tmp = new ArrayList<ArrayList<E>>(),tmp2  ;
    while (a.size()>1) {
        for (int i=1; i<a.size();i+=2) {
            tmp.add(merge(a.get(i-1),a.get(i)));
        }
        if (a.size()%2==1) tmp.add(a.get(a.size()-1));
        tmp2 = a;
        a = tmp;
        tmp = tmp2;
        tmp.clear();
    }
}

为了更清楚,我正在做的是合并 a 中的每个邻居,并将得到的合并数组放在外部数组中 tmp ,合并所有情侣后,一种方法是清除 a ,然后移动 tmp a ,然后将已清除的 a 移至 TMP 即可。 第二种方法是“抛出”旧的 tmp 并获取新的 tmp ,而不是重复使用旧的 tmp 。 / p>

2 个答案:

答案 0 :(得分:6)

作为一般规则,不要花费精力去重用旧的收藏品;它只会让你的代码更难阅读(并且经常不会给你任何实际的好处)。如果您的代码已经运行,那么只尝试这样的优化,并且您有硬数字表示算法的速度得到了提升。

答案 1 :(得分:2)

  1. 总是分配一个新的ArrayList并填充它,会导致更多的垃圾收集,这通常会减慢一切(较小的GC很便宜,但不是免费的)。

  2. 重新使用ArrayList会导致Arrays.copyOf()更少ArrayListclear()内的数组需要调整大小时(调整大小便宜但不免费)。

  3. 另一方面:ArrayList也会使数组内容无效,以允许GC收集未使用的对象,当然也不是免费的。

    但是,如果涉及执行速度,我会重用{{1}}。