性能优化的方法论建设

一. 相关概念

系统性能有两个相关的概念:

  1. Throughput ,吞吐量。也就是每秒钟可以处理的请求数,任务数。
  2. Latency, 系统延迟。也就是系统在处理一个请求或一个任务时的延迟。

而这两者之间又是存在着一些联系

  • Throughput越大,Latency会越差。因为请求量过大,系统太繁忙,所以响应速度自然会低。
  • Latency越好,能支持的Throughput就会越高。因为Latency短说明处理速度快,于是就可以处理更多的请求。

Throughput就是我们系统的qps,而Latency可以认为是接口的处理耗时。

因此优化每个接口的性能能够提升系统的qps。

另外还有两个概念

  • 计算密集型主要消耗大量CPU资源,不停进行计算。由于依靠CPU性能,一直占用CPU进行计算。
  • io  密集型磁盘读取,web服务等任务,主要需要IO的读取,利用CPU的效率较低,大量时间花费在IO上。

对于表现为IO密集的进程,应该经常运行,但每次时间片不要太长。对于表现为CPU密集的进程,CPU不应该让其经常运行,但每次运行时间片要长。

简单来说,就是计算密集型的系统减少线程的使用,而io密集型可以多创建线程。

我们目前的系统(web server)几乎都是io密集型。也存在少量单个接口处理请求的过程可能是计算密集型。


二. 常见性能优化的思考

先思考一个问题:

在代码中使用线程一定能优化性能吗?

这里有两个不同的例子

例子一 : 对比两个处理数据的方法

使用线程的方法:


不适用线程的方法:


使用线程的用时:31841

不使用线程的用时:20946

所以使用线程并没有优化到性能。

分析

为什么这个时候使用线程并不能优化性能?原因很简单,计算数据的方法getNumber()使用到synchronized关键字,调用这个方法的时候会加上this锁,因此每次只能有一个线程调用这个方法,其他线程阻塞了,只能等待释放锁后才能开始执行。因此,使用了多线程也只能串行计算。相反的,多线程还会多了一些线程切换的时间(别小看这个线程切换的时间,当需要处理的请求很多而处理时间很短时,线程间切换的消耗会激增)。

因此,当核心代码中有同步代码或者锁的时候,这时使用多线程并不能优化性能。

例子二:对比两个处理逻辑中有sleep的方法

使用线程的方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值