繁体   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