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

Ofe*_*Ron 2 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>>() ;
    }
}
Run Code Online (Sandbox Code Playgroud)

或这个 :

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以很清楚,我在做什么,是要合并每对夫妇的邻居的一个,并把结果合并阵列,阵列的外部阵列TMP,合并所有的夫妇后,一种方法是清除一个,然后移动TMP一个,然后将清除的a移动到tmp.第二种方法是"抛出"旧的tmp并获得一个新的tmp 而不是重用旧的tmp.

Lou*_*man 6

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