我认为我很聪明我实现了一个不使用比较函数的分类器,它只是重复计算每次迭代的比较元素的排序分数,而是计算分数(我称之为键)并缓存它们。对我来说,似乎与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倍。怎么来的?
答案 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;
}