性能优化的正确起点是采样,不是猜测
凭直觉调优最常见的结果是改了很多地方却没有收益。先把时间分布测清楚,再做决定,成本反而更低。
性能问题最容易出现的工作方式是凭经验猜:觉得数据库慢就先改查询,觉得网络慢就先加缓存。改完之后收益不明显,再改下一处。绕一大圈之后发现,真正占时间大头的环节一直没被处理。原因很简单:没有先测时间在哪里。
采样是最直接的起点。让系统在真实负载下运行一段时间,记录每个调用出现的频率与累计耗时,最后按占比排序。绝大多数项目里,前几个环节就会占掉总时间的大部分,后面的细节调优空间有限。这份数据同时也给讨论提供了共同基础,避免各说各话。
看采样结果时有三个常见陷阱。第一是把自己发起的收集当成系统开销,读数被工具本身抬高;第二是用平均值代替分布,掩盖了长尾;第三是把等待时间与计算时间混在一起,实际上大头是等待外部响应,改代码算法并不会有效果。
确定了热点之后,改动要一次只做一处,并且改完立刻复测。同时改两处就无法判断收益来源,甚至可能相互抵消。收益的衡量方式也要提前定好:是降低总耗时,还是削平长尾,还是减少内存占用。目标不同,合理的方案完全不同。
最后一项是别忽略用户感知阈值。某些内部环节从两百毫秒降到一百五十毫秒,指标改善明显,但用户察觉不到;而首屏的一次结构性改动,虽然耗时下降不多,体验差别却很大。把性能工作完全等同于指标优化,容易投入产出失衡。先确定用户能感知的部分,再决定是否继续深入。
读者留言 · 3 条
平均值掩盖长尾这点太常见了,很多优化其实只是在优化一个数字。
一次只改一处并复测,纪律性要求比技术难度高,但确实有效。
感知阈值那段是全文最有价值的,指标和体验不是一回事。
留言为读者个人观点,不代表本站立场。