以前在介绍无穷值的时候已经使用过惰性执行,惰性执行是一个过程值特征,使用惰性执行的过程值会将执行时间推迟,除了生成无穷值外惰性执行并不会改变程序运行结果,但合理使用惰性执行能够调整程序时间和空间使用状况,从而提升程序总体性能。算法
如下是惰性执行的使用例子:
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