在過去的幾天裏,我研究了LazyEvaluation,主要是在性能方面,想知道LazyEvalutaion的性能優勢在哪裏出現。LazyEvalutaion的性能優勢究竟在哪裏出現?
這是這麼不清楚我閱讀各種文章,但極少數,包括
What are the advantages of Lazy Evaluation?
這是指語法樹的評價。如果您懶惰地評估了語法樹 (即需要它所代表的值),則您的 必須通過整個計算的上一步完成其 。這是懶惰評估的開銷。但是,還有 兩個優點。 1)你將不必evaulate樹如果 結果是從未使用過,
JavaScript中,例如,實施如果語法。
if(true)
{
//to evaluate
}
else
{
//not to evaluate
}
在這種普通的情況下,我們沒有任何性能問題。
要評估完成,不進行評估,在語法樹中將被忽略。
然而,在一些遞歸循環,例如,Tak function AKA Tarai function
函數德(X,Y,Z){ 返回(X < = Y)? y: tak(x-1,y,z), tak(y-1,z,x), tak(z-1,x,y)); }
由於JS的渴望評估戰略評估函數(參數)的必然性, 的如果 - 其他 - 不被評估控制不再有效,並且德功能爆炸的評估步驟的數目。
反對躍躍欲試評估(JS或其他語言)的這一缺點,哈斯克爾可以評估德沒有問題,因爲它是,有些JS庫如lazy.js勝過像函數式編程,其中遞歸列表中的特定區域需要管理。
除了無限的列表,我明白這是LazyEvaluation性能優勢的確切原因。我對麼?
對於haskell程序員來說,性能實際上是懶惰評估中棘手的部分之一。真正的好處在於表達能力,允許程序員以多種不同的方式設計解決方案(例如,我想將這些代碼表示爲無限列表),並且能夠將解決方案拆分爲可輕鬆組成的部分,靈活在一個嚴格的語言評估問題將決定你如何構建你的代碼。你也需要懶惰才能真正擁有一種「聲明式」的語言,並且(理想情況下)一旦你擁有了你從未想過的「評估」。 – jberryman
@jberryman,感謝您的輸入。我同意。對於最後一部分,「聲明式」,除了懶惰,我認爲我們真的需要通過事件流以FRP方式將語言與IO結合起來。順便說一下,我喜歡你網站上的照片。 –