[英]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.