尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

我把那段代码优化了 5 倍,线上耗时一点没动

我把那段代码优化了 5 倍,线上耗时一点没动 上周我干了一件挺爽的事把一个接口里的一段列表组装逻辑从同步改成后置本地压测那一段从20ms 降到 3.7ms。5.4 倍。合并、上线然后我去看线上 P50。没动。在我百思不得其解时候我在好像想到了什么。问题可能不是提升不明显是在读数的噪声里根本看不出来。我优化错了地方而我本来有办法提前知道发现问题后我做了件早就该做的事把这个接口的耗时按段拆开量一遍而不是凭直觉猜哪儿慢。拆出来是这样段P50占比上游调用1747ms84%我方全部逻辑330ms16%端到端2069ms100%P90 更极端上游 3416ms我方那部分只剩13%。看到这张表那个5 倍优化为什么白干就一目了然了我优化的 20ms是那 330ms 里的一小块而那 330ms 本身只占 16%。更狠的是这个算术——哪怕我把我方那 330ms 全部优化到 0P50 也只是从 2069ms 降到 1747ms降 15%。也就是说我方代码的性能优化天花板就在那儿了。在拿到这张表之前我完全可以再花一周把 330ms 打磨到 200ms收获是 P50 降 6%而我会觉得自己干了件大事。四段归因优化之前先做这一步方法本身极其朴素朴素到我一直觉得不至于直到我白干了一次把一次请求的墙钟时间拆成四段分别打点入站—— 收到请求 → 开始处理网关、鉴权、参数校验、连接池等待上游—— 每一次外部调用的各自耗时不要合并成一个外部调用总计你需要知道是哪一个我方—— 自己的计算、序列化、DB出站—— 响应组装 → 写回四段之和要能对上端到端。对不上的那部分才是最值钱的信息——它通常是你根本没想到的地方锁等待、连接池排队、GC、日志同步刷盘。我这次量完得到三个结论只有第一个是我预期的✅ 上游是大头预期之内✅ 上游各接口耗时与部署前基线一致—— 说明上游没退化是它本来就这么慢不用去找上游扯皮❗ 曾经怀疑的那个2.5 秒静默段已经不构成瓶颈了—— 我脑子里那张性能地图是几个月前的早就过期了而我一直在用它做决策第三条是这次最值钱的收获。性能直觉的保质期比你想的短得多。那接下来该干什么拿到这张表之后可做的事和之前完全不一样了。优化我方代码这条路已经被数据判了死刑天花板 15%剩下的都在上游那 84% 上能不能不调—— 缓存、按需富化只在真需要时才去拉那部分数据能不能并行调—— 串行的几次上游调用有没有依赖能不能晚点调—— 把非首屏必需的挪到响应之后能不能少调—— 一次批量替代 N 次单条我最后走的是按需富化默认只返回骨架。注意这不是优化这是不干——性能问题最有效的解法往往不是让某段代码变快而是让它不发生。反过来说什么时候不该做四段归因免得这篇变成万物皆需归因的废话只有一段的时候不用做。纯本地计算、没有外部调用profiler 直接上就行。端到端已经达标的时候不用做。归因是给慢但不知道慢在哪用的不是给想让它更快一点用的。一次性脚本不用做。它的成本要摊在长期回归上才划算。它值钱的场景只有一个链路里有你控制不了的那一段。因为归因真正告诉你的不是哪儿慢是“哪儿是你能动的”。一句话优化之前先归因不是为了显得严谨。是因为你能动的那部分可能压根不是大头——而这件事凭手感永远猜不出来量一次就知道了。我用一次 5 倍的无效优化换了这张表。挺值的但下次我想先量。
返回列表