每周性能技巧 #87:双向门
本节阅读量:本文翻译自 Abseil 官网的 Performance Tip of the Week #87: Two-way doors。
原文发布于 2024 年 11 月 5 日,作者 Chris Kennelly,更新于 2025 年 7 月 16 日。
性能优化常常涉及不确定性。我们不一定能提前知道某个想法是否会成功。本篇讨论如何把难以逆转的一次性决策,转化为容易回滚、容易学习的双向门。
单向门与双向门
单向门是很难撤销的决策。它可能涉及公开 API、持久化格式、长期配置承诺或大量下游依赖。一旦通过,回头成本很高。
双向门则容易撤销。它可以通过 flag、局部迁移、金丝雀、实验或小范围原型来尝试。如果结果不好,我们可以退回来,损失有限。
性能工作中,我们应该尽可能把未知风险包装成双向门。这样就能更快学习,而不是在行动前要求完美确定性。
降低决策风险
要把优化做成双向门,可以使用几种策略:
- 先在一个代表性但有限的工作负载上验证。
- 保留旧实现,使用开关切换。
- 把迁移拆成许多小步,每一步都能单独回滚。
- 在接口层保持兼容,不急着删除旧路径。
- 用自动化监控检查性能和正确性回退。
这些技术并不会消除失败,但会降低失败成本。失败成本越低,我们越可以大胆尝试。
小改动的价值
小改动更容易评审、测试和回滚。它们也更容易把结果归因到具体原因。
大型改动可能一次包含多个假设:数据布局更好、缓存局部性更好、分支更少、API 更清晰。如果结果变差,很难知道哪一部分有问题。小改动能让每个假设更清楚。
当然,小改动也有成本:它们需要维护中间状态,可能让迁移周期变长。关键是选择能降低风险的拆分,而不是机械地把代码切碎。
用实验学习
双向门最有价值的地方,是它让实验变便宜。我们可以先验证收益最大的未知点,而不是一次性完成所有工程。
例如,在迁移数据结构之前,可以先对一个热点实例做实验,看看 cache miss 是否真的减少。在改变 API 前,可以先让一个调用点使用新 API,确认表达力和性能是否符合预期。
如果结果好,我们获得继续投入的信心。如果结果不好,我们用较低成本避免了更大失败。
结语
优化项目不需要一开始就拥有全部答案。把高风险决策设计成双向门,可以让团队更快行动、更快学习,并在错误方向上少花时间。