合理设置线程数【转】

本文探讨了Amdahl's定律下多线程程序的理论提速极限,及不同场景下线程数的最优设置原则。适用于CPU密集型、I/O密集型任务,并考虑了目标CPU使用率。

1.多线程程序相对于单线程程序的提速关系

 Amdahl's定律

  设处理器的数量为N,程序中必须串行(即无法并发化)的部分耗时占程序全部耗时的比率为p, 那么将这样一个程序改为多线程程序, 我们能够获得的理论上的最大提速Smax为

  Smax = 1 / (p + (1 - p) / N);

  设T(1)为该程序的单线程版运行总耗时,T(N)为该程序的多线程版运行总耗时, 那么将该程序改为多线程程序所得到的提速Smax为

  Smax = T(1) / T(N)

  N->∞ Smax = 1 / p

2.线程数设置的原则

  设Ncpu表示一个系统的处理器数目, Ncpu的具体值可以通过如下Java代码获取:

  int nCPU = Runtime.getRuntime().avaliableProcessors();

2.1 对于CPU密集型线程,可以将线程数设置为Ncpu + 1;

2.2 对于I/O密集型线程,优先考虑将线程数设置为1, 仅在一个线程不够用的情况下将线程数向2 * Ncpu靠近

2.3 对于有处理器使用率阙值的软件的设置

  Nthreads = Ncpu * Ucpu * (1 + WT / ST)

 Nthreads为线程数的合理大小, Ncpu为CPU数目, Ucpu为目标CPU的使用率(0 < Ucpu <= 1), WT(Wait Time)为程序花费在等待(如等待I/O操作结果)上的时长, ST(Service Time)为程序实际占用处理器执行计算的时长。在实践中,我们可以使用jvisualvm提供的监控数据计算出WT/ST的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值