我有一个TreeSet和一个自定义比较器。 我根据库存中的变化从服务器获取值
例如:如果时间= 0,那么服务器将发送股票上的所有条目(未分类) 如果时间= 200,则服务器将在时间200(未排序)
之后发送添加或删除的条目在客户端,我正在对条目进行排序。我的问题是哪个更有效率
1>首先获取所有条目,然后调用addAll方法 要么 2 - ;逐个添加
可能有数百万条目。
/////////更新///////////////////////////////////
private static Map<Integer, KeywordInfo> hashMap = new HashMap<Integer, KeywordInfo>();
private static Set<Integer> sortedSet = new TreeSet<Integer>(comparator);
private static final Comparator<Integer> comparator = new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
int integerCompareValue = o1.compareTo(o2);
if (integerCompareValue == 0) return integerCompareValue;
KeywordInfo k1 = hashMap.get(o1);
KeywordInfo k2 = hashMap.get(o2);
if (null == k1.getKeyword()) {
if (null == k2.getKeyword())
return integerCompareValue;
else
return -1;
} else {
if (null == k2.getKeyword())
return 1;
else {
int compareString = AlphaNumericCmp.COMPARATOR.compare(k1.getKeyword().toLowerCase(), k2.getKeyword().toLowerCase());
//int compareString = k1.getKeyword().compareTo(k2.getKeyword());
if (compareString == 0)
return integerCompareValue;
return compareString;
}
}
}
};
现在有一个事件处理程序,它给我一个更新条目的ArrayList, 将它们添加到我的hashMap后,我正在调用
final Map<Integer, KeywordInfo> mapToReturn = new SubMap<Integer, KeywordInfo>(sortedSet, hashMap);
答案 0 :(得分:0)
实际的实现是链接列表,因此如果你正确执行,逐个添加会更快。而且我认为在不久的将来这种行为不会改变。
对于您的问题,Statefull比较器可能有所帮助。
// snipplet, must not work fine
public class NaturalComparator implements Comparator{
private boolean anarchy = false;
private Comparator parentComparator;
NaturalComparator(Comparator parent){
this.parentComparator = parent;
}
public void setAnarchy(){...}
public int compare(A a, A b){
if(anarchy) return 1
else return parentCoparator.compare(a,b);
}
}
...
Set<Integer> sortedSet = new TreeSet<Integer>(new NaturalComparator(comparator));
comparator.setAnarchy(true);
sortedSet.addAll(sorted);
comparator.setAnarchy(false);
答案 1 :(得分:0)
我认为你的瓶颈可能与CPU相关的网络相关性更大。一次性获取所有新条目的批量操作将提高网络效率。
关于您的CPU,填充TreeSet所需的时间在多个add()和addAll()之间不会一致地改变。背后的原因是TreeSet依赖于AbstractCollection的addAll()(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/util/AbstractCollection.java#AbstractCollection.addAll%28java.util.Collection%29),后者又创建了一个迭代器并多次调用add()。
所以,我对CPU方面的建议是:选择让代码更干净,更易读的方法。这可能是通过addAll()获得的。
答案 2 :(得分:0)
通常,在加载alread数据时,它会减少内存开销。这也应该是时间效率的,可能使用小缓冲区。内存分配也需要时间。
然而,时间两个解决方案,在一个单独的原型。你真的必须测试大量的数据,因为网络流量也是如此。这是一个测试驱动开发,并将QA作为实施的正确性添加到QA中。