2024 Clojure现状调查!中分享您的看法。

欢迎!请查看关于页面以了解如何使用。

+1
Clojure
编辑

所以对于一个相对较小的 xrel 和相对较少的重命名,似乎可以获得一些性能提升

user> (def xrel {:a 1, :b 2, :c 3})
;; => #'user/xrel
user> (def kmap {:a :z})
;; => #'user/kmap
user> (quick-bench (set/rename-keys xrel kmap))
Evaluation count : 2959512 in 6 samples of 493252 calls.
         Execution time mean : 200.870412 ns
Execution time std-deviation : 0.882651 ns
Execution time lower quantile : 200.116289 ns ( 2.5%)
Execution time upper quantile : 202.248092 ns (97.5%)
               Overhead used : 2.151518 ns

Found 1 outliers in 6 samples (16.6667 %)
low-severe	 1 (16.6667 %)
Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
;; => nil
user> (quick-bench (set/rename-keys2 xrel kmap))
Evaluation count : 9627438 in 6 samples of 1604573 calls.
         Execution time mean : 59.646747 ns
Execution time std-deviation : 0.083186 ns
Execution time lower quantile : 59.540415 ns ( 2.5%)
Execution time upper quantile : 59.723488 ns (97.5%)
                Overhead used : 2.151518 ns
;; => nil
user> 

对于定义为 set/rename-keys2 的函数

(defn rename-keys2
  "Returns the map with the keys in kmap renamed to the vals in kmap"
  {:added "1.0"}
  [map kmap]
  (reduce-kv
   (fn [m old new]
     (if (contains? map old)
       (-> m
           (assoc new (get map old))
           (dissoc old))
       m)) map kmap))

这些内容是否可以作为研究改进 rename-keys 的起点?

1 个答案

0

我认为我会从尝试基于 update-keys 开始,而非其他任何事情。

这会类似如下

(defn rename-keys [m km] (update-keys m #(get km % %)))
by
无论如何,`update-keys` 总是返回一个映射,即便是对于 `nil`,而 `set/rename-keys` 对于 `nil` 会返回 `nil`。

而且,`update-keys` 版本(令人惊讶地)似乎要慢一点

用户> (quick-bench (clojure.set/rename-keys2 xrel kmap))
评估次数:9637890,在 6 次样本中,每次调用 1606315 次。
             平均执行时间:59.522351 纳秒
    标准偏差:0.059405 纳秒
   下四分位数执行时间:59.452942 纳秒(2.5%)
   上四分位数执行时间:59.580547 纳秒(97.5%)
                   使用的开销:2.151518 纳秒
;; => nil
用户> (quick-bench (clojure.set/rename-keys3 xrel kmap))
评估次数:5567220,在 6 次样本中,每次调用 927870 次。
             平均执行时间:106.542514 纳秒
    标准偏差:1.114478 纳秒
   下四分位数执行时间:105.393362 纳秒(2.5%)
   上四分位数执行时间:107.800880 纳秒(97.5%)
                   使用的开销:2.151518 纳秒
;; => nil
by
给定一个单键处理多次的映射,要做出这样的速度比较是很有挑战的。虽然 `update-keys` 在一般情况下可能会慢一些,但对于 `rename-keys` 的典型使用情况,还需要进行一些思考。在 `update-keys` 的情况下,我们确定通常需要出现在发送和接收信息包或处理实体映射的服务器应用程序中,需要对键进行整体转换——通常是将字符串键转换为关键字和反向转换。
...