Performance Clojure“;“相同值”;分配

Performance Clojure“;“相同值”;分配,performance,memory,clojure,Performance,Memory,Clojure,假设我有以下代码 (让[a(某些函数3) b(某些功能(+12)) (丙) (=a b)) 假设某个函数返回一个非常大的数据结构(比如一百万大小的数组) 第一个问题:clojure将分配多少内存?它将为这3个向量中的每一个分配内存,还是它们将共享相同的数据结构 第二个问题(密切相关):比较它们的速度有多快?=是否会迭代每个元素 这个简化的例子看起来可能很愚蠢,但在现实生活中也有类似的情况,这很重要 (map some-function [1 23 1 32 1 44 1 5 1 1 1 1])

假设我有以下代码

(让[a(某些函数3)
b(某些功能(+12))
(丙)
(=a b))

假设某个函数返回一个非常大的数据结构(比如一百万大小的数组)

第一个问题:clojure将分配多少内存?它将为这3个向量中的每一个分配内存,还是它们将共享相同的数据结构

第二个问题(密切相关):比较它们的速度有多快?
=
是否会迭代每个元素

这个简化的例子看起来可能很愚蠢,但在现实生活中也有类似的情况,这很重要

(map some-function [1 23 1 32 1 44 1 5 1 1 1 1])
编辑

在我的特定情况下,
some函数
返回两个集合的
conj
,这两个集合可能非常大

  • a
    b
    是否共享结构完全取决于
    某些函数的功能。没有任何细节是不可能回答的
    c
    a
    将绑定到相同的值,因此
    c
    没有额外的内存分配

  • 通常,
    =
    的语义和行为取决于您比较的值。如果比较集合,则是,
    =
    将遍历每个元素,直到耗尽它们,或者找到第一对不相等的集合

  • 此外:

    =
    将首先检查被比较的对象是否相同(参考等式),因此将立即比较
    a
    c

    虽然无法确定不同的
    函数调用是否返回相同或不同的结构,但如果没有记忆,它们可能会不同。只需使用
    memoize
    包装您的
    some函数
    ,以确保没有双重分配(当然,假设您的
    some函数
    是纯函数)

    (def some-function (memoize some-function))
    
  • a
    b
    是否共享结构完全取决于
    某些函数的功能。没有任何细节是不可能回答的
    c
    a
    将绑定到相同的值,因此
    c
    没有额外的内存分配

  • 通常,
    =
    的语义和行为取决于您比较的值。如果比较集合,则是,
    =
    将遍历每个元素,直到耗尽它们,或者找到第一对不相等的集合

  • 此外:

    =
    将首先检查被比较的对象是否相同(参考等式),因此将立即比较
    a
    c

    虽然无法确定不同的
    函数调用是否返回相同或不同的结构,但如果没有记忆,它们可能会不同。只需使用
    memoize
    包装您的
    some函数
    ,以确保没有双重分配(当然,假设您的
    some函数
    是纯函数)

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

    因此,即使
    a
    c
    在内存中共享相同的值和结构,比较它们也很慢?我只是在问题中添加了一些信息。提前感谢您的帮助,即使
    a
    c
    在内存中共享相同的值和结构,比较它们还是很慢的?我只是在问题中添加了一些信息。提前谢谢你的帮助