为什么让Haskell懒惰对性能产生影响?

时间:2016-06-20 03:55:35

标签: performance haskell lazy-evaluation

this video(逃离象牙塔 - 哈斯克尔之旅​​)中,Simon Peyton Jones说,让Haskell Lazy帮助他们对当时的机器进行资源限制。它还带来了许多其他懒惰的好处。

然后他说他们现在面临的挑战是懒惰会影响表现。

我的问题是:为什么让Haskell懒惰对性能产生影响?

1 个答案:

答案 0 :(得分:11)

如果您不打算使用某些内容的结果,那么懒惰地存储它然后从不执行它比无用地执行它更有效。这很明显很明显。

但是,如果 要执行它,那么懒惰地存储它然后再执行它比现在执行它效率低。还有更多的间接性。记下执行所需的所有细节需要时间,当您意识到实际需要执行时,需要花费时间将它们全部加载。

特别是添加两个机器宽度整数的情况。如果操作数已经在CPU寄存器中,那么立即添加它们就是一条机器指令。相反,我们费力地将所有这些东西放到堆上,然后稍后将其取回(很可能带有一堆缓存未命中和管道停顿)。

最重要的是,有时计算并不昂贵,并产生一个小的结果,但我们需要存储以便稍后运行计算的细节非常大。规范示例总结了一个列表。结果可能是一个32位整数,但要总计的列表可能是 huge !所有额外的工作,垃圾收集器管理这些可能会被解除分配的死对象的数据。

通常,使用 right 的懒惰可以带来巨大的性能提升,但使用错误的懒惰会导致令人震惊的性能灾难。而懒惰可能是非常棘手的理由;这个东西并不容易。根据经验,你会逐渐习惯它。