懒惰序列突然减速

时间:2012-04-13 02:39:35

标签: performance clojure lazy-sequences

我有这段代码:

:history
(cons [t (:latest thing)] (take n (:history thing)) )

用于在我的程序的每次迭代中向地图添加最近历史记录的滚动窗口。我发现经过一定次数的迭代(~50次)后,我的程序会逐渐减慢。

然而,如果我将代码更改为:

:history
(cons [t (:latest thing)] (take n (vec (:history thing))) )

然后程序在每次迭代时运行的时间稍长(因为实现了懒惰的seq),但是一直运行并且没有减速。

对Clojure不熟悉我不明白......是否与分块序列有关?

1 个答案:

答案 0 :(得分:1)

我认为通过程序减速你的意思是说“由于你的第一个代码样本可能有缺点的操作,因为序列变得更大,这个懒惰序列的消耗会减慢”。这是因为当你使用惰性运算符(如cons)构建一个惰性序列时,它会创建一个操作链(函数)来生成序列,每次你使用这个懒惰序列时,这个操作链就会被执行:50个缺点操作将创建一个50个链式函数调用,每次使用该序列时都会执行该调用,这显然比使用50个元素的向量并消耗它更慢。

在你的第二种情况下,懒惰序列只有1个操作(即缺点),其余的将从已经实现的向量(即向量调用)中进行操作