NS語言編程——惰性執行

惰性執行

以前在介紹無窮值的時候已經使用過惰性執行,惰性執行是一個過程值特徵,使用惰性執行的過程值會將執行時間推遲,除了生成無窮值外惰性執行並不會改變程序運行結果,但合理使用惰性執行能夠調整程序時間和空間使用狀況,從而提升程序總體性能。算法

如下是惰性執行的使用例子:
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

相關文章
相關標籤/搜索