这几天研究了LazyEvaluation,主要是在性能方面,想知道LazyEvalutaion的性能优势从何而来。
阅读各种文章对我来说很不清楚,但很少有,包括
这是指对语法树的评估。如果您懒惰地评估语法树(即,当需要它表示的值时),您必须将其完整地通过前面的计算步骤。这是惰性求值的开销。但是,有两个优点。1)如果从未使用过结果,您将不会不必要地评估树,
例如,JavaScript 实现了if语法。
if(true)
{
//to evaluate
}
else
{
//not to evaluate
}
在这种普通情况下,我们没有任何性能问题。
待评估已完成,未评估在语法树中被忽略。
但是,在某些递归循环中,例如,Tak 函数 AKA Tarai 函数
函数 tak(x,y,z){ 返回 (x <= y) ?y : tak(tak(x-1, y, z), tak(y-1, z, x), tak(z-1, x, y)); }
由于 JS 的 Eager Evaluation 策略评估函数(参数)的必然性,因此if - else - not to beevaluate控制不再起作用,并且tak 函数的评估步骤数爆炸式增长。
针对 Eager Evaluation(JS 或其他语言)的这一缺点,Haskell 可以毫无问题地评估tak ,并且一些 JS 库(例如lazy.js)在需要递归列表管理的函数式编程等特定领域表现出色。
除了无限列表,我知道这是 LazyEvaluation 性能优势的确切原因。我对么?