1. 性能评价指标

1.1. 响应时间

提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。
常用操作的响应时间列表:
image.png

1.2. 并发数

同一时刻,对服务器有实际交互的请求数。
和网站在线用户数的关联:1000 个同时在线用户数,可以估计并发数在 5% 到 15% 之间, 也就是同时并发数在 50~150 之间。

1.3. 吞吐量

2. 优化策略

2.1. 避免过早优化

不应该把大量的时间耗费在小的性能改进上,过早考虑优化是所有噩梦的根源。

所以,我们应该编写清晰,直接,易读和易理解的代码,真正的优化应该留到以后,等到 性能分析表明优化措施有巨大的收益时再进行。 但是过早优化,不表示我们应该编写已经知道的对性能不好的的代码结构。

2.2. 进行系统性能测试

所有的性能调优,都有应该建立在性能测试的基础上,直觉很重要,但是要用数据说话,
可以推测,但是要通过测试求证

2.3. 寻找系统瓶颈,分而治之,逐步优化

性能测试后,对整个请求经历的各个环节进行分析,排查出现性能瓶颈的地方,定位问题,分析影响性能的的主要因素是什么?内存、磁盘 IO、网络、CPU,还是代码问题?架构设计不足?或者确实是系统资源不足?

3. 优化方案

3.1. 前端优化

3.1.1. 减少请求数

合并 CSS,Js,图片

3.1.2. 使用客户端缓冲

静态资源文件缓存在浏览器中,有关的属性 Cache-Control 和 Expires 如果文件发生了变化,需要更新,则通过改变文件名来解决。

3.1.3. 启用压缩

减少网络传输量,但会给浏览器和服务器带来性能的压力,需要权衡使用

3.1.4. 资源文件加载顺序

css 放在页面最上面,js 放在最下面

cookie 包含在每次的请求和响应中,因此哪些数据写入 cookie 需要慎重考虑

3.1.6. 先给用户一个提示

有时候在前端给用户一个提示,就能收到良好的效果。毕竟用户需要的是不要不理他。

3.2. CDN 加速

CDN,又称内容分发网络,本质仍然是一个缓存,而且是将数据缓存在用户最近的地方。

无法自行实现 CDN 的时候,可以考虑商用 CDN 服务。

3.3. 反向代理缓存

将静态资源文件缓存在反向代理服务器上,一般是 Nginx

3.4. 应用服务性能优化

3.4.1. 缓存

3.4.2. 异步

3.4.3. 集群

3.4.4. JVM 调优

对 JVM 性能影响最大的是编译器。选择编译器是运行 java 程序首先要做的选择之一 热点编译的概念 对于程序来说,通常只有一部分代码被经常执行,这些关键代码被称为应用的热点,执行 的越多就认为是越热。将这些代码编译为本地机器特定的二进制码,可以有效提高应用性 能。

3.4.4.1. 选择编译器类型

-server,更晚编译,但是编译后的优化更多,性能更高

-client,很早就开始编译

-XX:+TieredCompilation,开启分层编译,可以让 jvm 在启动时启用 client 编译,随着代码 变热后再转为 server 编译。

缺省编译器取决于机器位数、操作系统和 CPU 数目。32 位的机器上,一般默认都是 client 编译,64 位机器上一般都是 server 编译,多核机器一般是 server 编译。

中的 mix mode 一般指编译时机:

-Xint 表示禁用 JIT,所有字节码都被解释执行,这个模式的速度最慢的。

-Xcomp 表示所有字节码都首先被编译成本地代码,然后再执行。 -Xmixed,默认模式,让 JIT 根据程序运行的情况,有选择地将某些代码编译成本地代 码。

-Xcomp 和 -Xmixed 到底谁的速度快,针对不同的程序可能有不同的结果,基本还是推荐用默认模式。

3.4.4.2. 代码缓存相关

在编译后,会有一个代码缓存保存编译后的代码,一旦这个缓存满了,jvm 将无法继续编译代码。

当 jvm 提示: CodeCache is full,就表示需要增加代码缓存大小。 –XX:ReservedCodeCacheSize=N 可以用来调整这个大小。

方法内联

逃逸分析

3.4.4.3. GC 调优

性能调优-进阶-1、JVM-GC调优

3.4.5. 代码

3.4.5.1. 选择合适的数据结构

image.png

3.4.5.2. 选择更优的算法

image.png

3.4.6. 并发编程

充分利用 CPU 多核, 实现线程安全的类,避免线程安全问题 同步下减少锁的竞争

3.4.7. 资源的复用

目的是减少开销很大的系统资源的创建和销毁,比如数据库连接,网络通信连接,线程资 源等等。

单例模式

池化技术

3.4.8. 反射优化

基本原理-1、反射 性能调优-进阶-1、JVM-GC调优

3.4.9. 序列化反序列化

经验专题-序列化与反序列化-1、选型比较

3.5. 数据库优化

MySQL-8、SQL优化

4. 实战经验

5. 参考与感谢