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