2017-09-15 72 views
-2

我想對多線程函數進行性能測試,結果顯示單線程函數的運行速度更快,這是我的代碼。hello world如何在沒有線程的情況下工作得更快

package jollyDay; 

public class JollyDay implements Runnable 
{ 
    public void run() { 
      System.out.println("Hello from a thread!"); 
     } 

     public static void main(String args[]) 
     { 
      int i=0; 
      while(true) 
      // {new JollyDay().run();i++;System.out.println(i);} 
      {(new Thread(new JollyDay())).start();i++;System.out.println(i);} 
     } 

} 

在螺紋函數,i是等於150000但在功能,而不螺紋i被等於400000在10秒那麼爲什麼螺紋較慢,不應該它更快?

。我的CPU有8個線程

+1

產生新的線程有性能上的開銷 - 使用它們,這樣一個小任務將意味着大部分工作是在開銷中完成的,而不是在實際的代碼中完成。此外,通過生成無限數量的線程,您將使操作系統難以調度線程(更多開銷)。當只使用一個線程時,您也不會經歷很多的上下文切換,但有許多您可能會遇到更多。 – hnefatl

+0

線程這樣的任務沒有意義。線程並不是「更快」,它是管理CPU執行的一種方式。電腦有點笨,他們一次只能做一件事。所以線程幫助我們按照所需的順序執行我們的任務。這要求你的線程有一個優先權(即,我應該先做什麼)。如果您爲自己的主題添加了優先級,則可以看到您的預期行爲。另外你的CPU沒有8個線程,它有8個內核。 – DoesData

+0

System.out.println()代價也很高。高性能打印應使用不同的方法 –

回答

2

創建Thread是一個代價高昂的操作。

在你的例子中,你創建了大量的線程,每個循環迭代一個線程。因此,您只需花費大量時間創建線程,而不是進行實際工作。

如果您執行足夠大的任務並將其分解爲可同時執行的較小任務,並使用合理數量的線程執行它們,則多線程化可能會更快(例如,與CPU /內核的數量有或只有它的一小部分)。

0

你正在創建在每個循環一個新的線程,線程數超過你的CPU內核的數量。由於CPU試圖對每個具有150000個線程的實例公平,這意味着每個線程只會在切換到新線程的後臺之前執行一段時間。

嘗試改爲創建2個線程或8個線程,這會產生更好的結果。

+0

您的建議是「嘗試創建2個線程或8線程「聽起來很簡單,但真的喲你要求OP改變程序的體系結構來使用_thread pool_,而不是爲每個任務創建一個新的線程。這對新手來說是一大步,它值得一些解釋。 –

0

要求你去這個源位置:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java

這是一個Thread類是如何在OpenJDK的6實現還有很多的工作,你的程序在每個循環做不產生任何可見的結果,並在此之後實際上閒置。在嘗試並行化一段代碼時必須小心,因爲Thread實例的創建和調度程序的努力也將被考慮。另外還有一些叫Amadahl的法則。如果並行化的成本比使用它的成本節約更多,則不應該這樣做。

如果您是使用多線程進一步感興趣的性能提高,我建議這個文章在這裏的快速閱讀:

http://tutorials.jenkov.com/java-concurrency/amdahls-law.html

相關問題