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

来自
遗憾的是,您那次稳固的IMO帖子没有得到回应。
来自
我同意。
来自
我对JMM的细节也感兴趣,但它们相当微妙。至少在这种情况下,Clojure开发团队似乎偶尔会为了更加的安全性而牺牲一些性能,这比向相反方向错误地权衡要好得多。
...