极客视点
极客时间编辑部
极客时间编辑部
113243 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/04:46
登录|注册

性能优化真的就只是改改代码?

讲述:初明明大小: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
    全面,多维度的性能优化策略
收起评论
大纲
固定大纲
一、性能优化的基本思路
1. 明确优化目的
2. 定标准
3. 找到瓶颈点
4. 着手优化
二、性能优化的具体方法
第一种情况:应用程序层面
第二种情况:组件层面
第三种情况:系统层面
显示
设置
留言
2
收藏
83
沉浸
阅读
分享
手机端
快捷键
回顶部