簡體   English   中英

為什么線程池實現比普通線程慢

[英]why threadpool implementation is slower than normal threads

我有一個代碼塊

for (i=0;i<size;i++)
{

      do job;

}

最初這個作業任務是按順序執行的(如上所示),但后來我用普通線程(內部可運行的類實現)制作了多線程,比如

for (i=0;i<size;i++)

{
   new threadingclass(some args) 
}

runnable threadingclass  {

  pub void run () {

      do job;

 }
} 

這個工作正常,有一些線程限制(直到系統資源足夠)所以為了避免資源重載我用標准的theadpool實現(線程池,執行器服務和工作線程實現)實現了相同的代碼

threadexecutor t=new threadexecutor(size)

for (i=0 ; i<size ; i++)

{
   t.execute(new threadingclass(some args))
}

runnable threadingclass  {

  pub void run () {

      do job;

  }
} 

現在的情況就像,

我想循環運行25次(沒有線程),我嘗試了所有3個實現

  1. 順序:大約需要7分鍾
  2. 正常多線程:40秒
  3. 使用線程池進行多線程處理(大小:100):約2分鍾

我有點困惑為什么正常的線程和thredpool實現時序差異太大,內部也是線程池不涉及太復雜的邏輯。 任何幫助表示贊賞。

提前致謝

它主要取決於您選擇的ExecutorService 在這里,你似乎選擇了一個FixedThreadPool ,它基本上相當於並行啟動你的線程,如果它的大小足以容納所有線程。 您可能甚至可以獲得一些性能提升,因為線程不是即時創建的。

ExecutorService通常是要走的路,因為它是可讀的,可維護的並且幾乎沒有開銷。 它在過去幾年也經過了嚴格的測試。

您的結果清楚地揭示了一個實現問題:您可能為ExecutorService示例運行size = 100測試,而對於其他示例則使用size = 25

您的處理器很可能只有4或8個核心。 在那么多之后的每個線程實際上都在減慢你的系統速度,因為它必須不斷地中斷正在運行的線程以便給下一個線程一些時間。

使用4個線程運行線程池,使用4個線程運行手動線程,您將看到性能差異很小。

可以配置ThreadPool大小,也可以配置生成的線程數...將它們設置為相同的數字以進行有效測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM