性能优化中的懒惰思想

107 阅读3分钟

性能优化中的一种思路是“懒惰”思想。其实懒惰思想的应用很广泛,它的思想是:“把工作推到尽可能迟来做。等事情一定要做了,我才做”。

通过懒惰思想提升性能的核心思路是:“如果把事情提前做了,可能会做一部分无用功;而当事情一定要做时才做,就不会浪费一点工作量。”

性能优化的目的主要有二:提升用户体验、降低成本。 而使用懒惰思想往往是为了降低成本。

如下是几个示例。

例1: 前端的懒加载

信息流的app可以一直无限往下滚动,但在启动时一般只会加载首屏的数据。后续的数据或者在首屏加载完成后进行异步加载, 或者在触发下拉操作时才去加载。

这样做的好处是减少了从后端获取数据的数据量,毕竟有大量用户可能根本不会下拉。

例2:缓存的过期清理

缓存软件(比如Redis)都会对数据设置一个过期时间, 当超过这个时间后,这个数据就会被视为无效,可以被清理掉。这样做可以避免数据无限增长下去。

那么如何实现这个功能呢?

一种简单粗暴的方法:每隔一段时间遍历一次。但这种方法很难有效,如果频率过高,在数据量大时性能会很差;而且过期数据的比例一般并不高,总是全部遍历在性能上也是一种浪费。

最直观的方法:给每一条数据都设置一个定时器,到了过期时间就触发删除。这样做自然也很差,会产生大量的定时器,性能很差。

因此,现在过期清理普遍都是基于懒惰原理,即只在再次请求到这个数据时,才判断一次是否过期。

当然,这样做还是会有隐患,比如数据只被请求了一次时,就再也不会被删除了。

因此,工业级的缓存软件在过期数据的清理上往往只是“以懒惰删除为主”,还会辅以其它方法,比如在数据量达到软上限时强制触发一次遍历 ,或像Redis这样,用定时任务每次随机抽一部分数据来清理过期数据。

例3 报表数据

某些平台生成报表的方式也是基于懒惰思想。(比如阿里云的账单报表)因为这类报表计算往往计算复杂而使用频率又非常低

这种情况下,管理后台不会把报表数据显示出来,而是只提供一个“生成报表”的功能,点击之后才开始生成,生成完之后去另一个页面下载。

总结

“只当事情必须要做时,才去做”的懒惰思想可以通过最小化工作量的方式来提升性能。但也要注意这仅仅是优化的思想之一。这种把事情推到最后的做法也有可能让“最后”的工作量堆得过多,反而影响了系统性能,或导致处理时间上升。在这种情况下,应反其道而行之,提前把尽可能多的工作预处理。