【发布时间】:2013-07-18 05:30:52
【问题描述】:
这几天研究了LazyEvaluation,主要是在性能方面,想LazyEvalutaion的性能优势体现在哪里。
阅读各种文章对我来说很不清楚,但很少有,包括
What are the advantages of Lazy Evaluation?
这是指语法树的评估。如果你评估一个 懒惰的语法树(即当需要它表示的值时),你 必须在其计算的前面步骤中执行它 整体。这是惰性求值的开销。然而,有 两个优点。 1) 如果 从未使用结果,
例如,JavaScript 实现了 if 语法。
if(true)
{
//to evaluate
}
else
{
//not to evaluate
}
在这种普通场景下,我们没有任何性能问题。
待评估已完成,未评估在语法树中被忽略。
但是,在某些递归循环中,例如,Tak function AKA Tarai function
函数 tak(x,y,z){ 返回 (x
由于 JS 的 Eager Evaluation 策略评估函数(参数)的必然性, if - else - not to beevaluate 控件不再起作用,tak function 的求值步数激增。
针对 Eager Evaluation(JS 或其他语言)的这一缺点,Haskell 可以毫无问题地评估 tak,并且某些 JS 库(例如 lazy.js)在特定领域表现出色比如需要递归列表管理的函数式编程。
除了无限列表,我知道这是 LazyEvaluation 性能优势的确切原因。我说的对吗?
【问题讨论】:
-
对于 haskell 程序员来说,性能实际上是惰性求值的棘手部分之一。真正的好处在于表现力,允许程序员以多种不同的方式设计解决方案(例如,我想将这段代码表示为无限列表)并且能够将解决方案拆分为可以轻松组合的部分,灵活;在严格的语言评估问题将决定您如何构建代码。此外,您需要懒惰才能真正拥有“声明性”的语言,并且(理想情况下)一旦拥有,您就不会考虑“评估”。
-
@jberryman,感谢您的意见。我同意。最后一部分,“声明式”,除了懒惰之外,我认为我们确实需要通过事件流以 FRP 的方式将语言与 IO 结合起来。顺便说一句,我喜欢你网站上的照片。
标签: javascript haskell functional-programming lazy-evaluation