以前在介紹無窮值的時候已經使用過惰性執行,惰性執行是一個過程值特徵,使用惰性執行的過程值會將執行時間推遲,除了生成無窮值外惰性執行並不會改變程序運行結果,但合理使用惰性執行能夠調整程序時間和空間使用狀況,從而提升程序總體性能。算法
如下是惰性執行的使用例子:
1.按需生產有限或無限的數據。函數
lazy generate(f){ return f()|generate(f); }
2.庫:性能
lazy Load_Math(){ max = $(){} min = $(){} exp = $(){} log = $(){} ln = $(){} lazy Angle = $(){ sin = $(){} cos = $(){} tan = $(){} atan = $(){} return math_angle_lib{sin:sin cos:cos tan:tan atan:atan} } return math_lib{max:max min:min exp:exp log:log ln:ln Angle:Angle()} } Math = Load_Math() ; ... Math.max(); Math.Angle.sin()
咱們使用命名來區分庫函數和自定義函數,Load_Math是一個惰性過程,所以在程序開頭導入庫時並不會當即執行,此時只用了一個變量的內存空間。只有當Math.max()調用時,Load_Math纔會綁定到對應過程值而後開始執行,執行時內存空間中建立了max、min、exp、log、ln、Angle六個變量以及與之對應的過程值和一個結構值,當執行完必後,變量佔用的空間即可以被回收,過程值和結構值則綁定到了變量Math,生命週期與Math相同。因爲其中Angle是個惰性函數,Math.Angle此時一樣只佔用一個變量的內存空間,而當Math.Angle.sin被調用時,Math.Angle纔會綁定到對應過程值並開始執行。優化
3.優化
emmm...我也想寫一個惰性優化算法的例子...惋惜我寫不出來0 0code