合理設置線程數


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM