请在2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多关于如何使用此工具的信息。

+3
Collections

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

是的,合并已经多年表现不佳。

https://github.com/bsless/clj-fast有一些备选方案和基准测试。

https://github.com/bsless/clj-fast/issues/1 中有许多不同看法以及一些有趣的注释。

欢迎使用Clojure问答社区,在这里您可以提问并获得Clojure社区的成员的回答。
...