为什么Dart的默认排序实现超过了我的密钥分类器?

时间:2014-06-10 14:46:19

标签: sorting dart

我认为我很聪明我实现了一个不使用比较函数的分类器,它只是重复计算每次迭代的比较元素的排序分数,而是计算分数(我称之为键)并缓存它们。对我来说,似乎与dart默认实现(或者就此而言,Java实现)相反。

无论如何,这是我的实施:

class KeySorter<V, K extends Comparable> {

  List<V> list;

  KeySorter(this.list);

  List<V> sort(K keyFn(V)) {
    Map<V, K> keys = {};
    list.sort((e1, e2) {
      var e1Key = keys.putIfAbsent(e1, () => keyFn(e1)),
          e2Key = keys.putIfAbsent(e2, () => keyFn(e2));
      return e1Key.compareTo(e2Key);
    });

    return list;
  }
}

这就是基准: https://gist.github.com/Gregoor/547c0451c4fa527dd85c

默认实现比我的要好4倍。怎么来的?

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,如果创建和查找缓存所花费的时间少于从头开始计算结果,则缓存才有意义。

您的实现还会通过不必要地使用putIfAbsent来人为地降低缓存查找速度。用初始缓存填充替换它后跟直接键查找将性能差异降低到只有2倍:

List<V> sort(K keyFn(V)) {
  Map<V, K> keys = {};
  list.forEach((e) => keys[e] = keyFn(e));
  list.sort((e1, e2) {
    return keys[e1].compareTo(keys[e2]);
  });

  return list;
}