今天看見je上一帖,對於上億資料求和的演算法,採用多線程到底快還是慢,我認為需要按情況而定。
1.單核,無IO,網路等資源操作情況下
結果:多線程比單線程理論上要慢
原因:多線程啟動線程需要消耗cpu資源,多線程只是把這一計算過程分區,在同一時刻只會有一個線程佔有cpu,所以採用多線程不但在啟動時耗費資源,線上程調度上同樣也耗費時間。所以單線程比多線程理論上要快。
2.單核,有IO,網路等資源操作情況下
結果:多線程比單線程理論上要快
原因:如果這上億資料需要從檔案中或者網路的其它地方(資料庫)擷取,在IO和網路操作的時候,由於IO和網路操作比cpu慢的多,所以cpu等待io操作;多線程的時候,當一個線程io讀取部分資料的時候,其它線程可以進行計算。而單線程需要等待檔案讀取完成後進行計算。所以理論上多線程要快。
3.多核,無IO,網路等資源操作情況下
結果:不確定
原因:在大部分作業系統上,一個進程的多個線程可以分配到多個cpu上平行處理所以多線程理論上比單線程快;在部分的作業系統上不支援一個進程的多個線程分配到多個cpu上平行處理,根據1的結果可以看出多線程理論上比單線程慢。
4.多核,有IO,網路等資源操作情況下
結果:多線程比單線程理論上要快
原因:如果作業系統支援一個進程的多個線程分配到多個cpu上平行處理,則多線程比單線程理論上要快。
如果作業系統不支援一個進程的多個線程分配到多個cpu上平行處理,則多線程比單線程理論上要快,根據2的結果得出。
拿je上高手們的一個例子:挖山洞,我擴充下。
單核,單線程,有IO:相當於從山的一側進行挖掘工作,工作者需要挖5分鐘,然後花費5分鐘,用小車將土運出。
單核,多線程,有IO:相當於從山的一側進行挖掘工作,工作者需要挖5分鐘,然後花費5分鐘,用小車將土運出,運土的時候,另一個工作者開始挖掘;
雙核,單線程,有IO:相當於從山的兩側一個工作者進行挖掘工作,工作者需要挖5分鐘,然後花費5分鐘,用小車將土運出;
雙核,多線程,有IO:相當於從山的兩側兩個工作者進行挖掘工作,工作者需要挖5分鐘,然後花費5分鐘,用小車將土運出;
單核,單線程,無IO:相當於一個工作者從山的一側進行挖掘工作。
單核,多線程,無IO:相當於兩個工作者從山的一側進行挖掘工作,一個挖,另一個歇息,輪流工作。
雙核,單線程,無IO:相當於從山的兩側一個工作者進行挖掘工作。
雙核,多線程,無IO:相當於從山的兩側兩個工作者進行挖掘工作。
當然有些工地只允許一個工作者工作。
例子雖然比較牽強,但也大致可以說出個理來。一年後在來分析下,看看能不能從更深的角度進行分析!
本文轉自www.35java.com