我对 lazy operations 和多级缓存的一点感悟

最近学的很多东西,都有不少共通的想法在里面。其中一个重要的思想就是 lazy。我最开始是在函数式语言、高性能矩阵运算等方面看到这个术语,然后又在 Rust 中见识了 iterator 中应用的 lazy 思想。后来,我又学习了线段树中的 lazy 标记等。总之,它们的共通点就是避免无用的计算,等待更多的运算打包在一起,藉此提高效率。另一个好处在于均摊运算的压力,因为如果运算集中起来可能导致卡顿。

有时候 lazy 操作不能提升运算效率,但可以简化实现。这一点在堆操作中有体现。MST 的 Prim 算法与 SP 的 Dijkstra 算法一般给学生讲解的时候都使用的 lazy 实现而不是 eager 实现。这样虽然堆大了点但是代码写起来更简单一点。

我在计算机系统中也见到了类似的思想。CS:APP 中讲解的现代计算机体系的各种设计与权衡,本质上是平衡各个模块之间发展的不均衡。其中为了应付磁盘和网络的低速率,使用了复杂的多级缓存方法。最近学习了 Dirty 的概念(其实初次见到 Dirty 的概念还是在知乎看大佬们的讨论看到的;第一次自己遇到是在 VS Code 的文件缓存里),主要也是为了降低交通流量。多级缓存很 Lazy 思想也有关联,都是尽量减小、延迟高消耗操作的数量和时间。

在程序设计中也可以使用类似的思想。但如果某种操作其实不能分摊,或者不能打包、合成的话,这种做法也会徒增程序的复杂度吧。

posted @ 2020-08-06 18:45  seideun  阅读(144)  评论(0)    收藏  举报