2024 年 Clojure 状态调查!中分享你的想法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

+2投票
转换器

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

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

  1. 这是否意味着创建不安全的转换器以获得更好的
    性能是可以接受的吗?
  2. 核心的有状态转换器可以写入不安全的 bewildertly
    性能接近 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投票

selected
 
最佳答案

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

所以是的,当我们确定在单线程减少上下文中使用不安全的转换器时,我们可以使用它们。但并不是在所有情况下。

+2投票

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

遗憾的是,你的IMO文章没有得到回应。
我同意。
我对JMM的细节也很感兴趣,但它们相当微妙。至少在这个案例中,Clojure开发团队,如果他们犯了错误,似乎更倾向于可能会牺牲一些性能以换取额外安全性,这似乎比犯相反错误更可取。
...