引用自https://clojure.org/reference/transducers#_creating_transducible_processes
转换过程必须封装由调用转换器返回的函数的引用
这些可能是状态和不可安全
在多线程中使用。
- 这意味着我们可以创建不可安全
的转换器以获得更好的性能吗?
- 核心的有状态转换器可以被写成不可安全
的以提高接近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")