簡體   English   中英

Clojure“相同價值”分配

[英]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 ,這可能非常大

  1. ab是否共享結構完全取決於some-function 沒有任何細節就不可能回答。 ca將綁定到相同的值,因此不會為c分配額外的內存。

  2. 通常, =語義和行為取決於您比較的值。 如果比較集合,則是, =將遍歷每個元素,直到耗盡所有元素或找到第一對不相等的元素為止。

另外:

=將首先檢查被比較的對象是否相同(引用相等),因此ac比較將立即進行。

雖然無法肯定地說不同的some-function調用返回的是相同還是不同的結構,但是沒有備忘的機會,它們將是不同的。 只需使用memoize包裝您的some-function ,以確保沒有雙重分配(當然,假設您的some-function是純凈的。)

(def some-function (memoize some-function))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM