簡體   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