2015-01-09 76 views
-4

如果我正在使用線程,那麼程序將在什麼時候完成執行?如果我使用線程,時間百分比有何改進?

假設它現在需要35分鐘。如果我將線程,然後什麼時候該過程將完成執行?

減少多少時間?

+2

如果是順序阻塞的任務,則需要35分鐘。如果不是,則爲並行任務引入線程並計算改進。 –

+2

34%。 2%。沒有8%。沒有17%。你如何期待我們知道?你的代碼在做什麼?你在說多少線程?你確定知道問題可以是多線程嗎?沒有更多的信息,這是無法回答的。 – John3136

+1

線程本身並不會使某些東西運行得更快,除非它可以並行化。現在,你的問題是無法回答的,因爲它嚴重依賴於需要35分鐘的操作性質。 –

回答

3

它完全取決於您在與整個程序的關係中進行並行化的部分,以及程序中的算法對並行可計算性的適用程度。有句老話叫One woman can have a baby in nine months, but nine woman cannot have the same baby in one month,也就是說「不是所有的算法都是高效並行計算的」,I/O就是一個很好的例子。

Amdahl定律指出,與n線程的程序,程序的一部分B的整體增速仍然是串行的是:

     1 
      -------------------------- 
      B + ((1/n) (1 - B)) 

什麼這個等式告訴我們的是,即使是infinite加速的程序的一部分隻影響該部分。 例如:

假設一個程序有一個函數Foo,它可以讓它自己並行運行。分析後,您會發現程序在Foo方法調用中花費了其總運行時間的25%。這意味着,即使你能夠無限地加快程序的這一部分,你的程序只會快33%(1/0.75)。

但是,當然,您無法使用線程無限地加速程序的任何部分,您可以將工作分解得更多。 你必須記住,創建/同步線程的開銷爲,所以即使有20個線程,也不會獲得20倍的加速。

但是,要回答您的原始問題,讓我們假設您的整個程序可以並行運行

如果要拆分n線程之間的工作了均勻,我經常發現,由於鎖定,同步和競爭,你通常會獲得0.6 * n速度增加,在平均情況下。

+4

現在對於OP認爲'0.6 * n'是普遍定律的部分,當它不準確時就會抱怨。 – immibis

相關問題