簡體   English   中英

有效的線程數

[英]Efficient Number of Threads

我想優化我的應用程序線程數。 幾乎所有這些IO都具有相同值的CPU使用率。 當系統中沒有其他應用程序運行時,有效線程數是多少。 我想要Windows和JVM下的答案。

每個操作系統都沒有答案。 這取決於代碼執行的特定任務集。 您應該使用不同的配置對應用程序進行基准測試,以確定哪個是最高性能的。

關於多線程的一些常規技巧:

  • 你無法像擁有更多線程的任務那樣加快速度; 例外情況是,如果您有多個CPU,則可以將計算任務與每個CPU一個線程並行化,前提是可以拆分此邏輯,使其不一定需要按順序執行。 一個很好的例子是像mergesort這樣的分而治之的問題,其中兩半可以按任何順序排序。

  • 您可以通過並行化不使用機器相同部分的任務來實現一些加速。 因此,假設您說您具有I / O和計算任務的“相等價值”,您將需要將它們分成不同的線程 - 再次,這假設排序並不重要。

如果是這種情況(與許多應用程序一樣),線程執行一些計算邏輯,然后執行一些I / O(例如,將數據寫入磁盤或數據庫服務器),那么很難得出一些公式確定您應該擁有的確切線程數,因為這將高度依賴於您正在處理的數據,處理方式以及處理完成后您正在處理的內容。 這就是為什么要做的最好的事情是擁有一個可配置的線程池,其大小可以輕松調整 - 然后運行一些不同大小的負載測試,看看哪一個表現最好。

Java Concurrency in Practice一書給出了一個粗略的公式,用於調整線程池的大小,以保持CPU與特定利用率的掛鈎:

N = CPU數量

U =目標CPU利用率,0 <= U <= 1

W / C =等待時間與計算時間的比率

使處理器保持所需利用率的最佳池大小(線程數)為:

PoolSize = N * U *(1 +(W / C))

這僅適用於CPU利用率。

您可以使用Runtime.getRuntime()獲取可用的處理器.availableProcessors()

我認為沒有明確的答案。 我建議嘗試使用不同數量的線程並查看哪些線程表現最佳。 一個開始的地方是比硬件中的處理器線程數多一個線程,例如,如果你有一個雙核處理器,每個核心有一個線程,那么使用3個線程。

性能遠不是使用線程的唯一原因。

基本上,任何多線程程序都可以使用一個更復雜的線程進行模擬,因此線程實際上正在做的是簡化代碼,而不是使代碼更快。

也就是說,如果您的應用程序可以同時使用多個核心或多個磁盤磁頭,那么線程可以很容易地利用它。 在這種情況下,您可能不需要比單獨的核心或磁頭更多的線程,因為進程切換具有明確的成本。

我發現處理這個問題的最好方法是不直接使用線程,而是使用Executor框架。 您可以嘗試不同的配置,但我發現我喜歡CallerRunsPolicy。

對此沒有普遍的答案。 您生成的線程數取決於您正在執行的任務數量,通信方式以及設計應用程序的方式。 我有非常大的應用程序,只有一個運行正常的線程。 另一方面,我也有一些小應用程序,為了性能而強制要求多線程。

(對不起任何拼寫/格式問題,我從手機上輸入了這個)

暫無
暫無

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

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