知识卡片

评价性能优化是否合理:让作者说清瓶颈和收益,用数据说话而非单纯看代码

普通读书笔记卡

内容

程序的性能很难仅凭阅读代码直接看出来,往往需要借助专门的性能测试工具、或者在实际环境中运行才能得到真实结果;如果只从代码角度粗略评价执行效率,能看的主要是两个方面——算法本身的时间复杂度(复杂度高的实现效率必然更低)、以及单步操作的耗时(访问数据库、访问I/O这类高耗时操作应当尽量少做)。但代码质量评价里更常见的实际问题反而是另一个方向:一些程序员对性能优化过于热衷,为了追求极致效率不惜牺牲代码的易读性、显著提高复杂度、甚至拉长开发周期——这类”过度优化”和”优化不足”其实是同一个问题的两面,都需要被纳入评价。针对这种情况,一个简单有效的检验办法是:直接让代码作者说出这段程序的性能瓶颈具体在哪里、为什么会存在这个瓶颈、以及这次优化究竟带来了多大的实际收益——如果作者能清晰回答这三个问题,说明这次优化是经过认真分析、真正对症下药的;如果作者说不清楚,那么无论代码本身写得多么”聪明”,这次优化投入的复杂度代价大概率是不划算的。最后还要强调一条更根本的原则:不管是判断优化不足还是判断优化过度,最可靠的办法始终是用真实数据说话,而不是单纯依靠阅读代码去主观判断——代码看起来”高效”或者”低效”,和它在真实负载下实际表现出来的性能,未必是一回事。这个案例提示了一条评价”技术决策是否合理”的通用方法:不要只看结果本身(这段代码是否做了性能优化),而要追问这个决策背后有没有清晰、可回答的分析过程(瓶颈是什么、为什么存在、优化带来了多大收益)——一个经得起这三个追问的优化决策,通常才是真正有价值、而不是为了炫技或者过度设计的优化。

参考来源

- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.6 系统运维之评价代码优劣的方法"节,"5.6.1 什么是好代码"(源文件:_epub-src/OEBPS/Text/Chapter5_6_2.xhtml) - 结论依据:原文说明"在实际工作中,也会见到一些程序员过于热衷优化效率,相对的,这会带来程序易读性的降低、复杂度提高,或者增加工期等。对于这类情况,简单的办法是让作者说出这段程序的瓶颈在哪里,为什么会有这个瓶颈,以及优化带来的收益……判断性能指标最好的办法是用数据说话,而不是单纯地看代码",直接支撑本卡片结论。 - 原始内容:对于这类情况,简单的办法是让作者说出这段程序的瓶颈在哪里,为什么会有这个瓶颈,以及优化带来的收益。当然,无论是优化不足还是优化过度,判断性能指标最好的办法是用数据说话,而不是单纯地看代码。