3

我試圖用下面的兩個解決方案複製200個文件,但我沒有看到差異(我用System.Diagnostics.Stopwatch來衡量時間)。在這兩種情況下,花費了8秒。第二個(並行)解決方案不應該更快嗎?我以爲是因爲它是使用Parallel的IO操作會加速複製。是否應該有差異來並行而不是並行地複製文件?

我失蹤了什麼?

// Case1 - Regular iteration 
foreach (FileInfo file in files) 
{ 
    string temppath = Path.Combine(destDirName, file.Name); 
    file.CopyTo(temppath, false); 
} 

// Case2 - Parallel 
Parallel.ForEach(files, file => 
{ 
    string temppath = Path.Combine(destDirName, file.Name); 
    file.CopyTo(temppath, false); 
}); 
+3

實際上,並行化磁盤IO很有可能導致**速度下降**。當同時複製兩個文件時,磁盤需要從兩個文件中讀取,即從完全不同的位置讀取。當一個接一個地複製它們時,您可以完全讀取每個文件 - 而不必讀取大量不同的區域。 – ThiefMaster

+0

好吧,可能是一個有趣的時間來嘗試這與高延遲網絡驅動器。 –

+0

..並在池中使用可配置數量的線程。 –

回答

5

並行執行任務不能保證性能得到改善。

在你的情況下,文件複製可能是IO綁定,而不是CPU綁定。 CPU通常具有比IO設備更多的帶寬(除非您碰巧使用的是Fusion IO卡或其他),所以IO操作往往會導致CPU等待很長時間。

使用大量CPU的任務可以並行執行以獲得性能提升。等待外部因素的任務也可以從轉移到另一個線程中受益,從而不會成爲阻塞任務。

但是,等待相同外部資源的任務可能看不到什麼好處,除非該外部資源本身可以處理與多個線程關聯的流量(IO往往無法處理流量,實際上可能會導致爭用的資源,減慢它)。

+0

如上所述,我希望看到這個嘗試使用網絡驅動器,甚至兩個網絡驅動器。 –

0

完全一樣@Adam以上,但增加了兩點:

如果你有機會,你可能會喜歡與一個或兩個網絡驅動器試試這個。高延遲連接上的文件傳輸具有較大的安裝延遲,可能會爲多線程解決方案帶來優勢,特別是在大量小文件的情況下。

使用具有小的固定數量的線程的池(2說)來確定是否可以減少磁盤爭用並提高性能可能也很有用。

如果你喜歡我的回答,請upvote @亞當,不是我。

+0

是不是網絡驅動器與本地驅動器相同。我的意思是它最終寫入同一個驅動器(相同的資源),儘管它是網絡驅動器。我對嗎? – theateist

相關問題