Clojure 2024 年度调查中分享您的想法!

欢迎!请参阅关于页面,以了解更多有关该系统的工作原理的信息。

+3
集合

merge 实现如下

(defn merge
 ;; stuff removed
  [& maps]
  (when (some identity maps)
    (reduce1 #(conj (or %1 {}) %2) maps)))

这从几个方面来看,都是有些次优的。由于reduce1reduce慢(当映射数量较小时可能不影响,但更重要的是,如果你只想合并两个映射,它还会做很多不必要的操作,因为合并两个映射基本上是

(when (or m1 m2) (conj (or m1 {}) m2))

有这样一个merge的多重参数版本来优化这种情况,是不是合理的呢?
一个快速的基准测试显示在这种情况下有可能将速度提高4倍。

我在 Jira 中查看了一下,但令人惊讶的是,我没有找到一个与此相关的工单?

2 条回答

+1
+1

是的,merge 几年来的表现一直不尽人意。

https://github.com/bsless/clj-fast提供了一些点击率和量化分析的替代方案。

在这方面有很多不同的实现,以及有关https://github.com/bsless/clj-fast/issues/1中的一些有趣注释。

欢迎来到Clojure问答社区,在这里您可以提问并从Clojure社区成员那里获得答案。
...