繁体   English   中英

具有两个元素的assoc-in和update / assoc之间的区别

[英]Differences between assoc-in with two elements and update / assoc

我已经做了一段时间了,例如(assoc-in my-hash [:data :id] 1) ,看起来还不错。

最近,由于我很少拥有两个以上的级别,因此我注意到我可以做(update my-hash :data assoc :id 1) ,听起来完全不同,但返回的结果相同。

因此,我想知道性能是否有差异? 您是否认为一种方式比另一种方式更具可读性? 更惯用吗?

update / assoc感觉对我来说更昂贵,但是我真的比assoc-in更喜欢它,这使我每次看到它都停下来思考。

当涉及到性能时,总是很容易衡量。 理想情况下,您将组装一张真实的地图(无论您的地图大小,都会对各种操作的相对成本产生一定的影响),并使用Criterium尝试两种方式:

(require '[criterium.core :as c])

(let [m (construct-your-map)]
  (c/bench (assoc-in m [:data :id] 1))
  (c/bench (update m :data assoc :id 1)))

在幕后, update + assoc有点像assoc-in的展开版本, assoc-in这里不需要辅助向量来保存键,因此我希望它比assoc-in更快。 但是(1)通常情况下,我不会担心性能方面的细微差别,(2)当我确实关心的时候,再次衡量要比猜测好。

(在我的框,使用Clojure 1.9.0-alpha14, update + assoc是在〜282纳秒VS为〜353纳秒确实更快assoc-in给出我小的测试图的(assoc (into {} (map #(vector % %)) (range 20)) :data {:id 0}) 。)

最终,在大多数情况下,可读性将是更重要的因素,但我认为您通常不能说一种方法比另一种方法更具可读性。 如果您的链已经使用assoc-in或多次update ,则出于一致性考虑,最好重复使用相同的功能(只是避免使读者怀疑“这东西真的不同”)。 如果您拥有自己控制的代码库,则可以采用一种“家庭风格”,这种家庭风格偏爱一种方法。 等等

assoc-in大多数情况下,我可能会看到assoc-in更具可读性-它使用一个“动词”并一目了然地知道更新的(唯一,准确)路径是什么-但如果您喜欢update + assoc并希望它们在代码库中的使用保持一致,这当然也很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM