Performance Clojure计数资源使用

Performance Clojure计数资源使用,performance,clojure,Performance,Clojure,不同的无限循环(在REPL,clojure 1.7.0中): 较低的循环也占用内存,因此不断的GC可能是CPU使用量巨大的原因。但是为什么首先会有这样的内存差异呢?函数范围创建了一个延迟序列。惰性序列仅按需创建其元素。如果惰性seq的开头与某个变量绑定(本地使用let或全局使用def),seq将缓存其所有元素,从而消耗内存。这通常被称为“抓住序列的头部” 这就是为什么您的第二个示例会占用大量内存 我希望使用jvisualvm进行的分析将表明,消耗CPU周期的不是clojure本身,而是JVM试图

不同的无限循环(在REPL,clojure 1.7.0中):


较低的循环也占用内存,因此不断的GC可能是CPU使用量巨大的原因。但是为什么首先会有这样的内存差异呢?

函数
范围
创建了一个延迟序列。惰性序列仅按需创建其元素。如果惰性seq的开头与某个变量绑定(本地使用
let
或全局使用
def
),seq将缓存其所有元素,从而消耗内存。这通常被称为“抓住序列的头部”

这就是为什么您的第二个示例会占用大量内存

我希望使用jvisualvm进行的分析将表明,消耗CPU周期的不是clojure本身,而是JVM试图应对不断增加的内存使用


最后,
count
遍历整个序列,从而实现所有元素。如果只是
(范围)
序列将永远不会结束,当没有更多内存可用时,它将停止。

计数
在计数时不保留数据。但是使用
def
时,物化数据由
x
变量保留。@KevinKostlan,因为序列可能会生成包含当前时间的元素。这意味着,如果不存储物化数据,那么对同一序列的第二次迭代将产生不同的结果。
(count (range)) ; ~100% of 1 CPU, as expected.
(def x (range))
(count x) ; Over 7 CPUs maxed out, on a 4-core machine (hyper threading?).