clojure.set/map-invert 的两个性能改进
1) 使用 reduce-kv 避免从输入映射中实例化 mapentry
2) 使用短暂创建输出映射
*性能:*
(使用 'criterium.core)
(导入 '[clojure.set :as set]))
(定义 m1 (zipmap (range 1) (range 1)))
(定义 m10 (zipmap (range 10) (range 10)))
(定义 m100 (zipmap (range 100) (range 100)))
(定义 m1000 (zipmap (range 1000) (range 1000)))
(quick-bench (set/map-invert m1000))
(quick-bench (set/map-invert m100))
(quick-bench (set/map-invert m10))
(quick-bench (set/map-invert m1))
;; 意味着之前: 138 ns 1.8 µs 20.6 µs 304 µs
;; 意味着之后: 151 ns 1.3 µs 9.0 µs 126 µs
*补丁:* clj-1808-map-invert-should-use-reduce-kv-and-transient.patch
*审核人员:* Alex Miller