知识卡片

性能优化的性价比真实案例:一天工作带来3分钟到2秒的提升,一周多工作只带来1秒提升

普通读书笔记卡

内容

一个真实的ERP项目案例展示了性能优化投入和收益之间可能存在的巨大落差。某个报表功能每次要2到3分钟才能生成,原始代码用了三层循环、每次循环都去数据库查一次数据、再拼装进一个界面控件里。第一步优化:把三层循环改成用存储过程直接输出数据、精简SQL计算逻辑、删除多余的外联操作——这一步大约花了一天时间,把加载时间从3分钟压缩到2秒,整个体验发生了质变(从”点了要等好几分钟”变成”唰的一下就出来了”)。后续为了追求更极致的体验,又花了一周多的时间做了一系列更精细的优化:删除大量被遮挡的无用UI控件、把打开界面时的杂项操作(如更新点击数)改成异步、甚至hack了默认的表格控件、实现按当前实际显示的行列数量精确加载数据、剩余部分异步加载——这一整套额外工作,实测下来(通过日志查证)总共只带来了大约1秒钟的提升,作者本人打开模块时甚至感觉不出明显区别。这个对比精确量化了一个反复出现在软件工程里的规律:绝大部分的性能收益往往来自定位并解决那个最主要的瓶颈(这里是数据库访问方式的根本性改变),投入产出比极高;而在此之后继续追加的一系列精细化优化,边际收益会急剧递减,投入产出比可能低到”耗费一周多时间只换来用户几乎感知不到的差异”。这个案例给出的实用启示是:面对一个性能问题,第一步应当集中精力找出并解决那个主要瓶颈,一旦主要瓶颈已经解决、性能已经进入”用户可以接受”的区间,继续投入大量时间做锦上添花式的精细优化,往往需要非常谨慎地评估这份投入是否真的划算——很多时候答案是不划算。

参考来源

- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.7 系统运维之如何应对烂代码"节,"5.7.2 改善性能与健壮性"(源文件:_epub-src/OEBPS/Text/Chapter5_7_3.xhtml) - 结论依据:原文详细描述该案例并给出量化对比:"把三层循环SQL改成了存储过程,大概花了我一天的工夫,使加载时间从3分钟变成了2秒……后面的一堆事情大概花了我一周多的时间……而所有的优化加起来,大概优化了1秒……即使是我自己,打开模块时也没感觉出有什么明显的区别",直接支撑本卡片结论。 - 原始内容:把三层循环SQL改成了存储过程,大概花了我一天的工夫,使加载时间从3分钟变成了2秒,模块加载变成了"唰"的一下……后面的一堆事情大概花了我一周多的时间……而所有的优化加起来,大概优化了1秒……即使是我自己,打开模块时也没感觉出有什么明显的区别。