場景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不成立。
這種解決方式不成立,效能降低比較厲害。