分享您的想法,参加 2024 年 Clojure 状态调查!

欢迎!请访问 关于 页面,了解有关工作原理的更多信息。

+2
转换器

来自 https://clojure.org/reference/transducers#_creating_transducible_processes 的引用

转换过程必须封装调用转换器返回的函数的引用
这些可能有状态且不安全
跨线程使用。

  1. 这是否意味着为了更好的性能
    可以创建不安全的转换器?
  2. 核心的有状态转换器可以写为不安全的
    以接近 loop/recur 的性能?

clojure.core/drop 不安全实现的基准

(definterface IMutable
  (get [])
  (set [new-val]))

(deftype UnsynchronizedMutable [^:unsynchronized-mutable n]
  IMutable
  (get [_] n)
  (set [_, nv] (set! n nv)))

(defn drop!
  ([n]
   (fn [rf]
     (let [nv (UnsynchronizedMutable. n)]
       (fn
         ([] (rf))
         ([result] (rf result))
         ([result input]
          (let [^long n (.get nv)]
            (.set nv (dec n))
            (if (pos? n)
              result
              (rf result input)))))))))

(comment
  (criterium.core/quick-bench
    (transduce (comp
                 (map inc)
                 (drop 1))
      + (range 1000)))
  #_"Execution time mean : 39,455570 µs"
  
  (criterium.core/quick-bench
    (transduce (comp
                 (map inc)
                 (drop! 1))
      + (range 1000)))
  #_"Execution time mean : 24,979885 µs")

2 个答案

0

选中
 
最佳答案

答案可以在这次讨论中找到 https://groups.google.com/d/msg/clojure/VQj0E9TJWYY/nXVf_H6sAgAJ

因此,确实,当我们确信关于单一线程减少上下文时,可以使用不安全的转换器。但并非在所有情况下。

+2

如果你愿意参与这场战斗,你可能对这个论坛感兴趣:https://clojure.atlassian.net/browse/CLJ-2146

遗憾的是,你可能认为你的一个扎实的帖子未得到关注。
我也这样认为。
我对JMM的细节也很感兴趣,但它们相当微妙,至少在这个案例中,如果Clojure的开发团队犯了错,他们似乎是在为了保证一些额外的安全性而牺牲一些性能,这显然比犯相反的错误要好得多。
...