數學與多線程

場景1:讀取大量文件,分析後,合併到一個二進制文件裏面。程序員

解決方案:多線程讀取各個文件,分析各自寫一份二進制緩存文件,最後合併各個緩存文件到一份文件裏面。緩存

 

設:  文件書n,開啓線程m,每份文件分析階段耗時p,每份合併文件耗時q多線程

逐個讀取合併文件耗時:n(p+q);線程

多線程合併耗時:((n/m)*(p+q))*α+nq   (α是與線程m成反比的參數,機器環境影響很大)二進制

  

成立條件:n(p+q)> ((n/m)*(p+q))*α+nq 程序

解方程: q>(α/(m-α))*p  假設  α=a/m^β=> q>(a/(m^(β+1)-a) *p    (a爲和機器環境相關的常數)文件

分析: m=1  >> q> ∞,不成立    時間

           m=2 >> q>(a/(2^(β+1)-a) *p 解決方案

           m=3 >> q>(a/(3^(β+1)-a) *p 參數

           m=4 >> q>(a/(4^(β+1)-a) *p

           能夠看出隨着線程數量的增加,不等式愈來愈容易達成,也就是越可以減少時間消耗。

α的變化是不容易預測的,過多的線程對處理效能的影響是至關大的。事實上,在個人代碼裏拼接二進制文件是個至關快速的過程,而分析階段每每耗費大量的時間。

 

程序員的職責就是追求更加優秀的效能,下一步我但願對合並文件階段進行多線程加速。不過這倒是個失敗的體驗。

場景2:文件n,線程數量m,歸併分組文件數量l,合併一份文件耗時p

解決方案:對文件進行分組,對多組進行多線程合併文件,在對合並後的文件進行分組合並,直到不足一組在逐個合併文件。       逐個合併耗時:n*p

     首先計算合併輪次:(假定文件數足量,餘數略去)

                    第一輪:(n/(l*m))*p;           

                    第二輪:(n/((l^2)*m))*(p*l);

                    第三輪:(n/((l^3)*m))*(p*l^2);.。。。。。

                    第q輪:(n/((l^q*m))*(p*l(q-1));.。。。。。

      分組合並耗時:(n/(l*m))*p*q

     分析:

       不等式: (n/(l*m))*p*q<n*p >>q<ml;

         q知足條件  (n/l^q)逼近l  結合上市 >>(logl n-1)-ml<0,從趨勢上看,隨着分組l的逐步增長,等式被減數減小,減數增加,等式愈來愈成立,l最大取到>>log(n)(n-1)-mn<0;n足夠大,前面的值趨向1,>>1-mn<0,不等式不成立。因此與不等式(logl n-1)-ml<0不成立。

         這種解決方式不成立,效能降低比較厲害。

相關文章
相關標籤/搜索