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
在内存中共享相同的值和结构,比较它们还是很慢的?我只是在问题中添加了一些信息。提前谢谢你的帮助