2017-12-27 461 views
0

我讀過,當您在單獨的線程(並行)中運行長時間運行的操作時,當您的PC具有多個處理器內核時,性能將有顯着改善。在C#中有一個函數Parallel.ForEach,我的理解是,它在每個處理器核心上運行的獨立線程中拆分長時間運行的操作。儘管如果只有一個內核,該函數將作爲簡單的Foreach循環(同步)運行。另外,如果您創建的線程多於處理器內核,則可能會產生負面影響。通過將長時間運行的任務分解爲單獨的進程來提高程序性能

我正在考慮創建一個單獨的控制檯應用程序,將args傳遞給它並在多個進程(如start -WindowStyle Hidden SeparateProcess.exe)上運行它的.exe。

編輯:
我已經創造了這樣的

class Program 
{ 
    static void Main(string[] args) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      Thread.Sleep(200); 
      Console.WriteLine("" + i); 
     } 
     Console.WriteLine(); 
     Console.WriteLine(Guid.NewGuid() + ": Process finalized."); 
    } 
} 

一個控制檯應用程序,然後,使用PowerShell執行了很多次:

For ($i=0; $i -lt 10; $i++){ 
start -WindowStyle Normal SeparateProcess.exe 
} 

這是否會提高程序的性能在單跑核心?

注:長時間運行的任務是Emgu CV圖像計算算法。

+0

多線程不僅僅是爲了利用多個內核。根據應用程序及其線程的作用,運行在單個內核計算機上的多線程應用程序可能仍然比運行在單個內核上的單線程應用程序更具性能。 多進程的一大缺點是它們不能共享內存或資源,而多線程的單進程可以。 – RavB

+0

您的進程不受CPU限制 - 大部分時間只是休眠。什麼會提高性能?它仍然會睡200毫秒100次,並且幾乎同時進行。寫入將全部採用相同的時間。 –

+1

@RavB *有很多原因可以在只有單核的機器上使用多線程(畢竟,線程已經被普遍使用了幾十年,而多核心的計算機只在一個十年內普遍使用)但這些原因不是表現。在單核心機器上,多線程代碼總是會少*性能(因爲你完成了相同的工作,但是具有線程開銷),但是儘管存在線程開銷,它仍然可以是有用的。 – Servy

回答

1

你應該嘗試它檢查自己,但是......

是否有提高長期運行的任務性能,即使只有一個核心的方法嗎?

是的,但顯然不是通過並行運行。你可以在代碼中使用性能分析器來找出哪些部分花費的時間最多,並嘗試以更優化的方式重寫它。

編輯基於評論:

如果你正在嘗試做的圖像處理與CV和你正在做的事情是CPU綁定(馬克塞斯同時運行的處理器),然後並行它是不會以幫助單核(他們將相互競爭CPU)。

如果你正在做的事情必須等待I/O完成,那麼並行化它將允許一些工作繼續進行,而其他進程則等待I/O。

這取決於你在做什麼 - 你應該關閉這個問題並且詢問一個更具體的問題,詳細說明你想要做什麼以及這個任務的CPU密集程度如何。 (順便說一句,如果可以的話,一種使圖像處理更快的方法是事先調整圖像的大小 - 你可能試圖用圖像處理較小版本的很多事情 - 例如:人臉檢測)。

+0

問題是,它不是我寫的代碼,需要很長時間才能完成,它是 - EmguCV圖像計算算法。 – Edgar

+0

它需要花費時間(同時,它很可能會盡可能快地完成任務 - 簡歷寫得很好)。 –

相關問題