内容简介:假设程序按照
- 要达到 降低延迟,提高吞吐量 的目的,有两个方向:一个是 优化算法 ,一个是 将硬件的性能发挥到极致
- 前者属于 算法 范畴,后者与 并发编程 息息相关
- 在 并发编程 领域, 提高性能本质上就是要提高硬件的利用率 ,主要是提升 IO利用率 和 CPU利用率
- 操作系统解决 硬件利用率 问题的对象往往是 单一的硬件设备 ,而 并发编程 要解决 CPU和IO设备综合利用率 的问题
综合利用率
假设程序按照 CPU计算 和 IO操作 交叉执行的方式运行,而且CPU计算和IO操作的耗时是 1:1
单线程
- 单线程时,执行CPU计算的时候,IO设备空闲,执行IO操作时,CPU空闲,所以CPU利用率和IO设备的利用率都是 50%
两线程
- 两个线程时,当线程A执行CPU计算时,线程B执行IO操作,当线程A执行IO操作时,线程B执行CPU计算
- 这样CPU利用率和IO设备的利用率都达到了100%,相对于单线程 吞吐量 提高了1倍
- 逆向思维:如果CPU和IO设备的利用率都 很低 ,可以通过 增加线程 来 提高吞吐量
多核
- 在 单核 时代,多线程主要用来 平衡CPU和IO设备
- 如果程序 只有CPU计算 ,那么多线程反而会让 性能变差 ,因为增加了 线程切换 的成本
- 在 多核 时代,纯CPU计算的程序可以利用多线程来 提升性能 ,因为利用多核可以 降低响应时间
- 例如对于4核CPU,可以将一个计算任务拆分成4个 独立 的子任务,交由4个线程分别在4个核上执行
- 采用单线程时CPU的利用率只有25%,而采用4线程时能将CPU的利用率提高到100%
线程数量
需要依据 具体的应用场景 来确定 线程数量 : CPU密集型 + IO密集型
CPU密集型
- 对于CPU密集型来说,多线程本质上是要 提升CPU的利用率
- 为了减少 线程切换 的成本,理论上设置为 CPU核数 即可
- 但在工程上,一般会设置成 CPU核数+1 ,这是为了 保证CPU的利用率 (在某个线程阻塞时,额外的线程能够补上)
IO密集型
单核
最佳线程数 = 1 + (IO耗时 / CPU耗时)
三线程
- 如果CPU计算和IO操作的耗时比是1:2
- 对于线程A,当CPU从线程B、C切换回来时,线程A正好执行完IO操作,这样CPU和IO设备的利用率都达到了100%
多核
最佳线程数 = CPU核数 * [1 + (IO耗时 / CPU耗时)]
关键参数
- 对于IO密集型的应用场景,关键参数是 IO耗时/CPU耗时 ,但这个参数是 动态变化 的
- 因此,如果要估算这个参数,需要做各个不同场景下的 压测
- 在压测的过程中,要重点关注 CPU、IO设备的利用率 和性能指标( 延迟+吞吐量 )之间的关系
转载请注明出处:http://zhongmingmao.me/2019/04/29/java-concurrent-thread-count/
访问原文「Java并发 -- 线程数量」获取最佳阅读体验并参与讨论
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Java 并发编程:多线程并发访问,同步控制
- Java 并发编程:多线程并发访问,同步控制
- 并发与多线程基础
- Java并发 -- 线程生命周期
- java线程并发工具类
- Python多进程并发与多线程并发编程实例总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Data Structures and Algorithms in Java
Robert Lafore / Sams / 2002-11-06 / USD 64.99
Data Structures and Algorithms in Java, Second Edition is designed to be easy to read and understand although the topic itself is complicated. Algorithms are the procedures that software programs use......一起来看看 《Data Structures and Algorithms in Java》 这本书的介绍吧!