为什么 Haskell 懒惰会对性能产生影响?
Why did making Haskell lazy have an impact on performance?
在 this video(Escape from the Ivory Tower - The Haskell Journey), Simon Peyton Jones 中说,使 Haskell Lazy 帮助他们解决了当时机器上的资源限制问题。懒惰也带来了很多其他好处。
然后他说他们现在面临的挑战是懒惰影响绩效。
我的问题是:为什么 Haskell 懒惰会对性能产生影响?
如果你不打算使用某些东西的结果,那么懒惰地存储它然后从不执行它比无用地执行它更有效。这点很明显。
但是,如果您要执行它,那么延迟存储它然后稍后执行它的效率低于现在执行它。涉及更多的间接性。记下执行所需的所有细节需要时间,当您意识到实际需要执行时将它们全部加载回去也需要时间。
对于添加两个机器宽度的整数之类的情况尤其如此。如果您的操作数已经在 CPU 寄存器中,那么立即添加它们是一条机器指令。相反,我们费力地将所有这些东西放到堆上,然后稍后取回它(很可能有一堆缓存未命中和管道停顿)。
最重要的是,有时计算并不那么昂贵,并且产生的结果很小,但我们需要存储到 运行 稍后计算的详细信息非常大。典型的例子是汇总一个列表。结果可能是一个 32 位整数,但要加总的列表可能 巨大 !垃圾收集器管理这些数据的所有额外工作,否则这些数据可能是可以被释放的死对象。
一般来说,使用 正确 的惰性可以带来巨大的性能提升,但是 错误的 使用惰性会导致可怕的性能灾难。懒惰可能很难推理;这东西不容易。有了经验,慢慢就会习惯了。
在 this video(Escape from the Ivory Tower - The Haskell Journey), Simon Peyton Jones 中说,使 Haskell Lazy 帮助他们解决了当时机器上的资源限制问题。懒惰也带来了很多其他好处。
然后他说他们现在面临的挑战是懒惰影响绩效。
我的问题是:为什么 Haskell 懒惰会对性能产生影响?
如果你不打算使用某些东西的结果,那么懒惰地存储它然后从不执行它比无用地执行它更有效。这点很明显。
但是,如果您要执行它,那么延迟存储它然后稍后执行它的效率低于现在执行它。涉及更多的间接性。记下执行所需的所有细节需要时间,当您意识到实际需要执行时将它们全部加载回去也需要时间。
对于添加两个机器宽度的整数之类的情况尤其如此。如果您的操作数已经在 CPU 寄存器中,那么立即添加它们是一条机器指令。相反,我们费力地将所有这些东西放到堆上,然后稍后取回它(很可能有一堆缓存未命中和管道停顿)。
最重要的是,有时计算并不那么昂贵,并且产生的结果很小,但我们需要存储到 运行 稍后计算的详细信息非常大。典型的例子是汇总一个列表。结果可能是一个 32 位整数,但要加总的列表可能 巨大 !垃圾收集器管理这些数据的所有额外工作,否则这些数据可能是可以被释放的死对象。
一般来说,使用 正确 的惰性可以带来巨大的性能提升,但是 错误的 使用惰性会导致可怕的性能灾难。懒惰可能很难推理;这东西不容易。有了经验,慢慢就会习惯了。