提高将大量有序映射合并为一个有序映射的性能 - java

时间:2009-12-16 11:46:27

标签: java performance merge sortedmap

我有一个方法将SortedMap作为输入,此地图包含许多SortedMap对象,此方法的输出应该是一个SortedMap,其中包含输入映射中保存的地图的所有元素。方法如下所示:

private SortedMap mergeSamples(SortedMap map){
  SortedMap mergedMap = new TreeMap();
  Iterator sampleIt = map.values().iterator();
  while(sampleIt.hasNext())
  {
    SortedMap currMap = (SortedMap) sampleIt.next();
    mergedMap.putAll(currMap);
  }
  return mergedMap;
}

这是一个性能杀手,我可以在这里改进什么?

3 个答案:

答案 0 :(得分:2)

我认为您的代码没有任何问题;你所能做的就是尝试SortedMap的替代实现。第一个是ConcurrentSkipListMap,然后查看Commons CollectionsGoogle CollectionsGNU Trove。后者可以产生非常好的结果,特别是如果你的地图的键和值是原始类型。

答案 1 :(得分:2)

是否要求输入为SortedMap?对我来说,如果输入只是一个集合或列表似乎更容易。这可能会加快创建输入,并可能更快地迭代所有包含的地图。

除此之外,我认为提高此代码性能的最可能的方法是提高compareTo()实现合并的有序映射中的值的速度。

答案 2 :(得分:1)

您的代码尽可能好。但是,在我看来,数据结构的整体设计需要进行一些检查:您使用的是SortedMap<?, SortedMap<?, ?>,但未使用父地图的键。

你想表达一个带有嵌套元素的树吗?你的任务是展平树吗?如果是这样,要么创建一个支持您的方法的Tree类,要么使用智能方法来合并键:

public class NestedKey implements Comparable<NestedKey> {

  private Comparable[] entries;

  public NestedKey(Comparable... entries) {
    assert entries != null;
    this.entries = entries;
  }

  public int compareTo(NestedKey other) {
    for(int i = 0; i < other.entries.length; i++) {
      if (i == entries.length)
        return -1; // other is longer then self <=> self is smaller than other
      int cmp = entries[i].compareTo(other.entries[i]);
      if (cmp != 0)
        return cmp;
    }
    if (entries.length > other.entries.length)
      return 1; // self is longer than others <=> self is larger than other
    else
      return 0;
  }

}

用作SortedMap键的NestedKey条目通过比较其每个条目与其他NestedKey个对象进行比较。存在于所有元素中但具有更多条目的NestedKeys被假定为更大。因此,你有这样的关系:

  • NestedKey(1,2,3)&lt; NestedKey(1,2,4)
  • NestedKey(1,3,3)&lt; NestedKey(2,1,1)
  • NestedKey(1,2,3)&lt; NestedKey(2)

如果您只使用一个使用NestedKey作为其键的SortedMap,则其.values()设置会自动返回所有条目,展平。但是,如果您只想使用SortedMap的一部分,则必须使用.subMap。例如,如果您希望NestedKeys的所有条目都在2到3之间,请使用.subMap(new NestedKey(2), new NestedKey(3))