線程池中創建多少線程合適

通俗一點,如何讓你的系統處理更快,(降低延遲,提高吞吐量)。

對應方法進本兩個方向,一個算法,另一個將硬件性能發揮極致。 提升性能就是,提升硬件的利用率。

也就是提升i/o的利用率和cpu的利用率。

你線程池的創建線程條數直接影響你係統的性能。

 

思考問題一,分工產生效能 

在單核cpu時代,假如你用多線程的話,主要就是用來平衡cpu和I/O設備,如果你的程序只設計cpu計算,沒有I/O操作的話,多線程不但不會提升性能,還會是性能變的更差,原因就是線程的切換成本。

我給你舉個例子,你公司就你一個員工,老闆讓你一會寫代碼,一會打掃衛生,還順帶着幫老闆拿個快遞。

這樣會造成什麼,切換成本。馬克思說分工產生效能就是這麼理解的。

在多核cpu時代,即使只進行cpu計算, 多線程也可以提高性能了,就好比一個公司來了四個員工(四核cpu),這樣可以分別拿快遞,打掃衛生,寫代碼等工作了。

 

那麼創建多少條線程合適?

這裏先要理解你的系統是cpu密集型(大部分都是純cpu計算),還是I/O密集型(大部分都是I/O操作),因爲cpu執行時間顯然要比I/O操作要快。

cpu密集型:這裏沒啥好說的,因爲本質就是cpu計算,線程數等於cpu核數,爲什麼呢你想,你公司現在4個員工,這四個員工都有自己工作,2個員工寫代碼,一個拿快遞,一個打掃衛生,這樣各幹個的,你非要讓那個打掃衛生的員工給你去買菸,這樣就造成了這個員工的切換成本了(4核cpu開了5條線程)。也就是說你創建線程月多,切換成本越大。

注意:這裏我只是比喻一下,爲了你好理解,正常工程上,創建的線程數=cpu核數+1,爲了就是偶爾的內存頁失效,或者阻塞時候,這個額外的線程可以頂上,從而保證cpu的利用率(比如做保潔的員工在給你買菸的路上出了啥問題。其他的員工可以頂上,目的就是爲了讓你順利的抽上煙)。

I/O密集型的計算場景,I/O操作耗時和cpu耗時比值非常關鍵,但是這個比值是動態的具體可以藉助一些工具測試。

計算公式爲  最佳線程數 =cpu 核數*(1+(I/O耗時/cpu耗時))。 可以理解爲 一個線程執行完I/O操作之後,(I/O耗時/cpu耗時)個線程完成了各自的cpu計算 ,這樣cpu利用率達到100%(純理論上的)

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章