[英]Clojure “same value” allocation
說我有以下代碼
(let [a (some-function 3) b (some-function (+ 1 2)) ca] (= ab))
假設某些函數返回一個非常大的數據結構(例如一百萬個數組)
第一個問題:Clojure將分配多少內存? 它將為這三個向量中的每一個分配內存,還是它們將共享相同的數據結構?
第二個問題(密切相關):比較它們有多快? 是否=
遍歷每個元素?
這個簡化的示例可能看起來很愚蠢,但是在現實生活中,類似的情況非常重要
(map some-function [1 23 1 32 1 44 1 5 1 1 1 1])
編輯
在我的特定情況下, some-function
返回兩個集合的conj
,這可能非常大
a
和b
是否共享結構完全取決於some-function
。 沒有任何細節就不可能回答。 c
和a
將綁定到相同的值,因此不會為c
分配額外的內存。
通常, =
語義和行為取決於您比較的值。 如果比較集合,則是, =
將遍歷每個元素,直到耗盡所有元素或找到第一對不相等的元素為止。
另外:
=
將首先檢查被比較的對象是否相同(引用相等),因此a
和c
比較將立即進行。
雖然無法肯定地說不同的some-function
調用返回的是相同還是不同的結構,但是沒有備忘的機會,它們將是不同的。 只需使用memoize
包裝您的some-function
,以確保沒有雙重分配(當然,假設您的some-function
是純凈的。)
(def some-function (memoize some-function))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.