性能问题 - 清除并重用集合或抛出它并获得新的集合 [英] Performance issue - clear and reuse a collection OR throw it and get a new one
问题描述
public void merge(ArrayList< ArrayList< E> a){
ArrayList< ArrayList< E>> tmp = new ArrayList< ArrayList>>();
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>>();
}
}
或这个:
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 移动到 ,然后将已清除的 移至 tmp 。
第二种方法是扔旧的 tmp ,并获得新的 tmp ,而不是重用
作为一般规则,不要花费力量重复使用旧的集合;它只是使你的代码更难阅读(并且经常不给你任何实际的好处)。只有尝试了这样的优化,如果你已经有你的代码正常工作了,而且你的硬数字表示算法的速度有所改善。
Say we try to implement a merge sort algorithm, given an Array of Arrays to merge what is a better approach, this:
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>>() ;
}
}
or this :
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();
}
}
to make it clearer, what i was doing is to merge each couple of neighbors in a and put the resulting merged arrays in an external Array of Arrays tmp, after merging all couples, one approach is to clear a and then move tmp to a, and then move the cleared a to tmp. second approach is to "throw" old tmp and get a new tmp instead of reusing the old one.
As a general rule, don't spend energy trying to reuse old collections; it just makes your code harder to read (and frequently doesn't give you any actual benefit). Only try optimizations like these if you already have your code working, and you have hard numbers that say the speed of your algorithm is improved.
这篇关于性能问题 - 清除并重用集合或抛出它并获得新的集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!