2024 Clojure状态调查!https://www.surveymonkey.com/r/clojure2024

欢迎!请查看关于页面以获得更多关于此功能的信息。

+2
转换器

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

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

  1. 这意味着创建不安全的转换器以提高性能是可以的吗?
    核心的有状态转换器可以被写为不安全的版本,以便性能接近loop/recur吗?
  2. 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")


选中答案

0

选中答案
 
最佳回答

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

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

+2
 图片无法显示

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

 图片无法显示
遗憾的是,你的帖子没有得到回应。
 图片无法显示
我同意。
 图片无法显示
我也很感兴趣JMM的细节,但它相当微妙,至少在这个案例中,Clojure开发团队,如果他们犯了错误,似乎是在牺牲一些性能的情况下选择可能有时额外的安全性,这比犯相反方向的错误要远为可取。
...