以下是超快的。
(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/