合理设置线程数
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的值。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |