java多線程性能淺析

今天看見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:相當于從山的兩側兩個工作者進行挖掘工作。

  當然有些工地只允許一個工作者工作。

  例子雖然比較牽強,但也大致可以說出個理來。一年后在來分析下,看看能不能從更深的角度進行分析!
 本文由用戶 quguiliang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!