线程数量与程序性能的关系
本文纯属经验之谈,关于单线程和多线程与程序性能的关系!
首先绝大多数设备都是多核的,多线程能比单线程更充分的利用cpu,多线程如果使用线程池就能省下创建线程的开销.如果只是纯粹的计算可能会比单线程要高,而且计算量越大差距会越明显
在我们的实际业务中,以读取数据库为例,当涉及到各种的io操作情况下,毫不犹豫的应该选择多线程了,能避免io传输带来无谓的耗时. 处理能力得到有效的提升.
----------以上为单线程与多线程分析-------
标题讲的是多线程数量与程序性能的关系.
我们在设置线程池数量的时候,很可能对这个数据感到疑惑.2?3?4? 还是传说中的cpu核数*2+1?
另外一个问题:一个线程池设置了 cpu核数*2+1 ,你的程序只有一个线程池么?
如果不是,你的线程总数可就可能达到50 100 甚至更多了. 那么再想想这么大的一个数量和你预想的cpu核数*2+1 是不是有冲突?
很多人想线程数量设置得和cup线程数量相关,这样想让每个cpu的核心处理一个线程逻辑 达到更好利用cpu的效果.
但是对于jvm而言,线程数量远多于原先的预想.一个cpu 分配执行的线程绝对大于1个,而这个分配关系我们程序无法控制
架构越来越大,线程池的数量也会根据业务需求得到一个增加.
为了避免io操作和线程同步的影响线程数量会被调高,当然不一定越高越好.但这个数值不会低.
-------以上为多线程数量分析-------
还是拿数据库连接池来分析具体分析.有的人可能会设置连接池数量最大为5,有的人会说5绝对不够用.
这个不够用的依据又出自于哪呢. 我想是没的.
关于这个数量标准应该是通过不断的调校以达到单个任务延迟最低的目的.
这里面涉及到的消耗大概有:创建sql,获取连接,传输sql,数据库查找/操作数据,传输返回信息,处理返回信息
程序的每处涉及到多线程的地方都应该用这种方式进行判断,这样才能有效的提高程序性能.
对于线程数过多带来的资源分配问题得再讨论了.