需求推动计算

程序可以先建立一个计算的描述,直到后续步骤需要它的结果时才实际执行。某个分支从未使用到的值,便可能完全不用计算。惰性求值改变的是计算安排:程序怎样把输入变成结果,仍须服从语言语义;一个表达式看起来很长,并不说明其中所有部分都会立刻运行。

参考:[1]

延迟与共享结果

常见的按需计算会将延迟表达式放在一种对象中,首次需要时求值,再保存结果供以后复用。这样与每次使用都重新计算的按名策略有所区别。何时强制求值、成功结果怎样缓存,以及异常是否重复出现,要看具体语言与接口;这些规则决定重复访问的实际行为。

参考:[2]

按部分消费数据

一个序列可以按需要逐项产生,而不是先准备全部元素。消费者只取前几项时,后面的计算可能尚未发生;这也让有限程序能够描述可继续延伸的序列。构造这样的过程需要保证每一步能交付所需部分,否则消费者等待首项时,仍可能陷入没有进展的计算。

参考:[1]

时间与内存的取舍

延迟可能节省未使用的计算,也会增加保存待求值对象和结果的需要。若引用链持续保留已经不需要的前部数据,内存仍可能增长。实际程序可以在适当位置强制求值或释放引用,平衡响应时间与空间。惰性是控制求值的一种方式,优化效果要结合消费模式来衡量。

参考:[2]