合理设置线程数

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的值。

猜你喜欢

转载自www.cnblogs.com/zsy831143/p/11569288.html
今日推荐