clojure - 为什么Partial的Clojure这么慢

标签 clojure

以下是超快的。

 (let [a (atom {})] 
  (doall (map #(swap! a merge {% 1}) (range 10000))) (println @a))

但是如果加上偏的话,那就太慢了。代码返回的结果应该相同,对吗?为什么性能差异如此之大?
(let [a (atom {})] 
  (doall (map #(swap! a (partial merge {% 1})) (range 10000))) (println @a))

最佳答案

(partial f a)#(f a %)实际上有很大的不同。

无论f的定义如何,都可以为部分应用的函数提供任意数量的参数,运行时会将它们放在列表中,并使用apply获得结果。因此,无论如何,每次使用partial构造的函数时,都会构造一个短暂的列表。另一方面,#()创建一个新类,并且如果您使用旧的JVM将permgen与常规堆分离,那么当您用完越来越多的类专用内存时,这可能会成为一个问题。

关于clojure - 为什么Partial的Clojure这么慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28036128/

相关文章:

list - Clojure - 将列表转换为 Java 数组

vector - 将元素添加到嵌套向量

Clojure包含的范围? prime-seq 打印顶部素数

clojure - 何时以及可以使用 leiningen 评估 clojure 文件多少次?

clojure - 如何列出别名的依赖关系?

clojure - 编辑程序 "while they are running"?为什么?

clojure - 为什么要使用阅读器宏#'?

clojure - 评估映射中的函数

java - 没有 Java 的 ClojureScript

clojure - 功能性地遍历树