Loading

MoreEffect[17] 考虑使用懒惰计算法

懒惰计算法

懒惰计算法在于将计算延迟到需要计算结果时再去计算,如果永远不需要用到结果,就永久都不去计算。这套方法常见于各种应用领域:

引用计数

字符串的拷贝通常会有较大的开销,如果在复制构造函数中让新旧对象共享同一个字符串数据,就能省去数据的复制步骤。共享数据需要添加引用计数,以记录共享者并确定合适应该释放;当任意一方需要修改时,就必须复制新的数据,即写时复制。

基于引用计数简化堆中的跟踪过长,实现内存的一对多共享。同时解除了使用者需要及时释放内存的负担,避免不必要的拷贝和析构操作。

区别对待读取和写入

通过operator[]修改一个有写时复制机制的string,读操作只需要返回对应的字符,而写操作必须拷贝字符串本身。写时复制必须能够区分[]是读取或是写入,但operator[]函数不可能区分左值还是右值。我们可以通过懒惰计算法的延迟机制,通过代理类的方法在operator[]函数外判断。(具体见第30节)

懒惰提取

一些对象的数据需要从服务器接口、或数据库中提取,但实际程序并不总是会用到这些数据,那么提取操作就被浪费了。懒惰提取即将提取延后到需要对数据操作时进行。

懒惰表达式

Matrix<int> m1, m2;
Maxtix<int> m3 = m1 + m2;

懒惰表达式建立一个新的数据结构表示m3m1和m2的和,而非直接进行加法运算,且建立上述的记录比直接计算更快且节省内存。

总结

懒惰计算法不总是适用的,其高效核心在于__避免不必要的计算__。如果计算本身比较重要,是必须进行的,实现懒惰计算法所需要维护的数据反而是额外的负担,在实际情况下的最优解往往需要是基于业务,在时间和空间中权衡。

posted @ 2021-09-30 21:49  sandersunkown  阅读(67)  评论(0)    收藏  举报