[英]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個實現
我有點困惑為什么正常的線程和thredpool實現時序差異太大,內部也是線程池不涉及太復雜的邏輯。 任何幫助表示贊賞。
提前致謝
它主要取決於您選擇的ExecutorService
。 在這里,你似乎選擇了一個FixedThreadPool
,它基本上相當於並行啟動你的線程,如果它的大小足以容納所有線程。 您可能甚至可以獲得一些性能提升,因為線程不是即時創建的。
ExecutorService
通常是要走的路,因為它是可讀的,可維護的並且幾乎沒有開銷。 它在過去幾年也經過了嚴格的測試。
您的結果清楚地揭示了一個實現問題:您可能為ExecutorService
示例運行size = 100
測試,而對於其他示例則使用size = 25
。
您的處理器很可能只有4或8個核心。 在那么多之后的每個線程實際上都在減慢你的系統速度,因為它必須不斷地中斷正在運行的線程以便給下一個線程一些時間。
使用4個線程運行線程池,使用4個線程運行手動線程,您將看到性能差異很小。
可以配置ThreadPool
大小,也可以配置生成的線程數...將它們設置為相同的數字以進行有效測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.