2008-09-18 50 views
0

我有一個關於在.NET中使用流從磁盤加載文件的問題。我正在努力查明性能問題,並希望確定它是我認爲的地方。在.NET中FileStream延遲加載?

Dim provider1 As New MD5CryptoServiceProvider 
Dim stream1 As FileStream 

stream1 = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read) 
provider1.ComputeHash(stream1) 

問:從磁盤中讀取當我創建FileStream對象,或者當對象消費流,在這種情況下,MD5哈希算法實際上它讀取字節?

與我的本地測試環境相比,使用ComputeHash方法時,我發現Web主機上存在重大性能問題。我只是試圖確保性能問題在哈希中,而不是在磁盤訪問中。

回答

1

FileStream只是圍繞文件對象公開一個IO.Stream,並使用緩衝區。它不會讀取構造函數中的整個文件(該文件可能比RAM大)。

性能問題很可能在哈希中,您可以執行一些簡單的基準來證明是因爲文件IO還是算法本身。你可以嘗試的第一件事

但一個是:

provider1.ComputeHash(stream1.ToArray()); 

這應該做出的FileStream讀取整個文件,並返回一個字節數組。 .ToArray()可能會調用比ComputeHash調用的.Read()方法更快的方法。

0

是的文件的內容將被讀取然後你運行ComputeHash方法,而不是當你只是打開一個FileStream。

測試性能問題的最佳方法是從文件讀取數據到內存流中散列它並測量每個步驟的性能。你可以爲此使用System.Diagnostics.Stopwatch類。

0

當調用者通過調用Read或類似的方法請求它們時,應該讀取磁盤中的字節。無論如何,硬盤和操作系統都會執行一些預讀操作來改善順序讀取操作,但這無疑難以預測。

你也可以嘗試使用一些構造函數重載爲FileStream提供的緩衝區大小參數。