请在 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

很遗憾,你的IMHO出色的帖子没有得到回复。
我同意这一点。
我对JMM的细节也很感兴趣,但它们相当微妙,至少在这个案例中,Clojure开发者团队,如果他们有错误,似乎是在牺牲一些性能的代价来追求可能有时额外的安全性,这看起来比犯相反的错误要好得多。
...