The Importance of Benchmarks
3 days ago
- #Performance Optimization
- #Algorithm Improvement
- #Benchmarking
- 啊哈!开发团队发现一份冲刺报告因为一个长达1000天的冲刺导致加载耗时15分钟,这触发了一次性能调查。
- 性能瓶颈被确定在冲刺进度解析环节,影响了包括回顾和燃尽图在内的所有冲刺报告。
- 原算法为冲刺的每一天(包括空日)克隆数据,导致内存和速度问题。
- 假设:内存使用随天数线性增长,随着记录累积,克隆后期日期的速度变慢。
- 解决方案一引入了一个新的数据结构(ParsedSprintProgressData),将空日存储为null,使内存使用减少高达90%。
- 基准测试显示,内存改进仅带来20%的运行时间提升,这推翻了最初的假设。
- 性能剖析识别出两个热点路径:lodash.cloneDeep()和moment.format(),它们是主要的性能开销来源。
- 解决方案二用显式复制替换了cloneDeep(),并用自定义日期格式化函数替换了moment.format()。
- 结合这两种方法后,解析速度更快,内存使用更少,且空日的影响降至最低。
- 现在,有问题的报告解析时间缩短到不到一秒,提升了三个数量级,不过渲染仍需几秒钟。