在this video(从象牙塔逃生-Haskell旅程)中,Simon Peyton Jones说让Haskell Lazy帮助他们解决了当时所拥有机器上的资源受限问题。懒惰还带来了很多其他好处。
然后他说,他们现在面临的挑战是懒惰会影响绩效。
我的问题是:为什么让Haskell变得懒惰会对性能产生影响?
最佳答案
如果您不打算使用某物的结果,则懒惰地存储它,然后再不执行它比无用地执行它更有效。那是显而易见的。
但是,如果要执行它,则延迟存储它,然后再执行它比现在执行它的效率低。涉及更多的间接性。记下执行所需的所有细节需要花费时间,并且当您意识到实际需要执行时,需要花些时间将所有这些全部加载回去。
像添加两个机器宽度整数之类的情况尤其如此。如果您的操作数已经在CPU寄存器中,则立即添加它们是一条机器指令。取而代之的是,我们费力地将所有这些东西放到堆上,然后稍后将其取回(很可能有很多缓存未命中和管道停顿)。
最重要的是,有时计算并没有那么昂贵,并且产生的结果很小,但是我们需要存储的细节才能稍后运行计算。典型的例子是汇总一个列表。结果可能是一个32位整数,但是要累加的列表可能很大!垃圾收集器管理这些数据所需的所有额外工作,否则可能是可以被重新分配的死对象。
通常,懒惰使用正确会导致巨大的性能提升,但是懒惰使用错误会导致可怕的性能灾难。懒惰可能非常棘手。这东西不容易。有了经验,您就会逐渐适应它。