1 性能优化的根本目的是什么?
可能很多人没有认真思考过:“为什么我们需要进行性能优化?”这个问题。
在我看来,性能优化是为了“解决良好的用户体验和资源的有限性之间的矛盾”。
首先,我们性能优化一般都是追求更快的响应速度,通常最终目的是为了获得更好的用户体验。
这里所说的资源是广义上的资源,“资源的有限性”包括:资金成本的有限性,人力资源的有限性,服务器等硬件资源的有限性,时间的有限性(如为了抢占市场,希望尽早上线造成的压力)等。
如果资源是无限的,如开发周期很长,投入的人力很多,服务器资源充足,甚至服务器内存是无限大的,那么设计出来的产品可能就不需要花费太多精力去优化。
2 出现性能问题的主要原因
通常,产品发布早期由于用户量较少,不太容易出现性能问题或者通常不会太去关注性能问题;但随着业务的不断发展,性能问题就逐渐暴露出来。
导致性能问题的原因有很多,常见的原因有:
- 项目工期紧张,设计阶段技术方案考虑不充分;
- 项目中使用了不合理的数据结构或算法;
- 系统架构设计不合理;
- 同步执行耗时任务;
- …
3 性能优化的核心环节
不知道大家有没有深入思考过,我们平时写代码到底在写什么?
可能有些人会调侃地说:“无非就是 CURD”。
其实我们编码都是围绕着输入、处理和输出三个主要环节展开的。
因此,性能优化也要着重从这三点进行考虑。
如考虑如何更快地查询出数据,更快地对数据进行处理,更快地渲染数据等。
通常来说,处理部分是其中最核心的环节,也是优化的重点。
4 寻找性能瓶颈
性能优化的前提是要找到性能瓶颈,通常需要通过自测、压测、耗时告警日志、数据库慢查询日志、调用链路追踪技术等手段,发现性能瓶颈。
通常在实际开发中,某个接口的响应时间过长影响用户体验,如果条件允许,就要考虑优化。
通常 2C 的业务更关注性能优化,2B 的业务相较于 2C 的业务通常来说性能问题只要不是太严重,通常没那么紧迫。
产生性能瓶颈的原因有很多,如使用的算法时间复杂度较高、数据库查询语句没有覆盖到索引、调用链路过长等。
如果需要分析接口找出性能瓶颈,推荐大家使用 arthas ,可以使用其中的 trace 命令,该命令可以追踪调用链路,给出调用的耗时。
如使用 trace 命令,对某个耗时较长的接口进行分析: trace com.xxx.service.impl.AServiceImpl refresh
,给出下面结果:
根据上面的结果可以看出,com.yyy.service.impl.AServiceImpl:refreshSomeThings
耗时最长,可以继续再 trace 耗时最多的子函数,最终定位到最影响耗时的函数上。
找到耗时最长的环节之后,根据具体代码推断出耗时长的原因,然后再针对性地进行优化。
优化后可以通过性能测试、压力测试等手段验证性能优化的有效性。
性能优化方法论系列目录
《一、性能优化的本质》《二、性能优化方法论的思想源泉》
《三、性能优化的核心思想(1)》
《三、性能优化的核心思想(2)》
《三、性能优化的核心思想(3)》
《四、性能优化的注意事项》
《五、实际案例分析》
《六、总结》
创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。