下面谈论的背景都是CPU密集型
提高性能的两种方式:
- 减少任务的执行时间
- 增加任务的计算单元
- 第一种方式是单线程方式的优化思路,执行时间不可能一直减少,所以优化到一定程度后,会到达瓶颈。
- 第二种优化方式是多线程并发思路的方式,可以通过增加处理任务的计算单元,让性能提高。由于提高不受限制,优于第一种方式。
并发方式也有瓶颈,瓶颈取决于并发任务中的串行部分。
并发任务的串行部分,也就是多线程的数据共享部分。数据的共享的保护大多使用的是锁。多个线程在申请锁失败后,会进入阻塞状态等待这个锁,阻塞导致了线程上下文的切换,产生了线程的性能开销。
要避免线程的开销,必须减少锁的竞争。
锁的相关参数有两个:
- 锁的请求频率
- 持有锁的时间
- 缩小锁范围(减少持有锁的时间)
- 减小锁的粒度(降低锁的请求频率)
减小锁粒度,可以把一个大锁分成小锁。这里要注意死锁问题,避免死锁的常规方法是每个线程的加锁顺序必须相同。