性能优化真的就只是改改代码?
极客时间编辑部
讲述:初明明大小:4.37M时长:04:46
来源:跨界架构师(ID:Zachary_ZF)
性能优化是软件开发过程中必不可少且非常困难的工作。很多程序员可能会认为性能优化等于改改代码,真的只是这样吗?日前,某垂直电商技术总监张帆在其个人公众号“跨界架构师”中,分享了他做性能优化的思路以及具体的优化方法。以下是具体内容。
一、性能优化的基本思路
1. 明确优化目的
优化的目的有很多个,它可以是增强用户体验,也可以是节省服务器带宽流量、减少服务器压力等等。你需要先明确优化目的,这样才能避免陷入到无意义的性能黑洞中。
2. 定标准
优化是永无止境的,你需要根据实际业务情况,定出一个相对客观的标准,这个标准代表你要优化到什么程度。
比如,你根据当下的性能指标与业务量对比,发现最大并发数可能会超过当前的 2 倍,那么此时合理的优化标准就应该是提升 3 倍,或者至少保证提升 2.5 倍。
3. 找到瓶颈点
很多人做优化的时候逮着代码就开始改,但其实在大部分情况下,流程上的优化要远胜于语法级别的优化。这里的“流程”除了业务流程之外,还包括技术层面的流程,比如数据在网络中的流转过程等。
你需要借助一些客观数据,获得更多与运行环境相关的信息,并找到整个“木桶”上最短的一块“板”,定位性能的瓶颈点在哪。
4. 着手优化
优化的时候需要避开两个常见的误区:
第一,不要过度追求应用的单机性能,如果单机表现良好,还应该从整体角度去思考;
第二,不要过度追求单一维度上的极致优化,比如过度追求 CPU 的性能而忽略了内存方面的瓶颈。
二、性能优化的具体方法
第一种情况:应用程序层面
现实工作中遇到的大部分性能问题,都是由应用程序的部分代码导致的。这时,你可以从以下 5 个方面进行优化:
1. 缓存
缓存的数据结构设计很重要,没有一种数据结构是万能的。数据结构设计得越简单、单一,缓存数据的二次运算就越多。
此外,如果缓存的数据量很大,就要增加一个缓存淘汰算法,否则会白白浪费大量内存资源。
2. 异步
做异步主要有以下两种方式:通过线程进行异步。主要用于涉及到 I/O 的地方,像磁盘 I/O 和网络 I/O;通过中间件异步,比如 MQ。适用于更大的场景,通过 MQ 进行异步可以大大提高性能。
3. 多线程和分布式
线程不要分得太多,否则管理成本会非常高,分布式系统中也存在类似的管理成本问题。
此外,如果你能用单机多线程解决问题,就不要引入分布式,否则你需要做大量的额外工作,费时费力。
4. 延后运算
这个和缓存的思路相反,它适用于一些低频、运算耗时的数据。
5. 批量,合并
如果你需要在短时间内频繁地传递多个数据到同一个目的地,你要尽量将他们打包到一起,一次性传输,特别是涉及到 I/O 的场景。如果你的系统是一个单点系统,将数据打包传输的性价比会非常高。
应用程序层面的优化方式还有很多。比如,用长链接代替频繁打开关闭的短链接、压缩、重用等等。
第二种情况:组件层面
组件是指那些非业务性的东西,比如一些中间件、数据库、运行时的环境(JVM、WebServer)等。
数据库的调优可以分为以下三个部分:SQL 语句、索引、连接池。
对运行时的环境进行调优时,对 JVM 的调优主要是调优 GC 相关的配置,对 WebServer 的调优主要是针对连接相关的调优。
第三种情况:系统层面
你可以借助系统层面的一些技术指标,来观测并判断程序是否正常。比如,CPU、线程、网络、磁盘以及内存。
CPU 方面,判断它是否正常,大多数情况下关注这三个指标就够了:CPU 利用率、CPU 平均负载、CPU 上下文切换。
线程方面,除了要关注线程数之外,还需要关注一下处于“挂起”状态的线程数量有多少。数量越多,意味着程序里锁竞争越激烈,你需要通过其它方案来缩小锁的粒度、级别,或者避免用锁。
以上就是今天的内容,希望对你有所启发。
原文链接:性能优化 = 改改代码?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- 梁中华一般性能问题都是出在存储和缓存的使用上
- Bravery168全面,多维度的性能优化策略
收起评论