2009-11-02 46 views
2

如果您有興趣,也會詢問一個非常類似的問題here on SO,但是我們將看到該問題的接受答案並非總是如此(並且從未如此應用程序使用模式)。FileStream在應用程序冷啓動時速度很慢

性能確定代碼由FileStream構造函數(打開文件)和SHA1哈希(.Net框架實現)組成。該代碼幾乎是我在上面鏈接到的問題中提出的C#版本。

案例1:應用程序第一次或第N次啓動,但具有不同的目標文件集。現在通知應用程序計算以前從未訪問過的文件的散列值。

  • 〜50ms的
  • 80%的FileStream構造
  • 18%哈希計算

案例2:應用程序現在已經完全終止,並重新開始,要計算在相同的散列files:

  • 〜8ms
  • 90%哈希計算
  • 8%的FileStream構造

問題
我的應用程序始終是在使用案例1。它永遠不會被要求重新計算曾經訪問過的文件的散列值。

所以我的速度決定步驟是FileStream構造函數!我能做些什麼來加速這個用例?

謝謝。

P.S.統計使用JetBrains分析器收集。

+0

我看到完全相同的行爲的PInvoke CreateFile。使用ReadAllBytes和計算散列需要很短的時間,但在內存上可能會很糟糕(取決於文件的大小)。所以我試圖通過一個FileStream到MD5的computehash($流)並看到完全不可接受的結果。結果時間差異在數量級... – thepip3r 2014-03-28 19:29:04

回答

1

文件系統和/或磁盤控制器將緩存最近訪問過的文件/扇區。

確定速度的步驟是讀取文件,而不是構建FieStream對象,並且當數據在緩存中時,在第二次運行時它將顯着更快,這是完全正常的。

+0

我不相信這是這種情況。 FileStream構造函數不讀取整個文件,哈希函數爲此調用。但是,構造函數需要80%的時間。 – 2009-11-02 21:14:12

0

你應該儘量使用本地FILE_FLAG_SEQUENTIAL_SCAN,你將不得不爲了得到一個手柄,它傳遞給FileStream

+0

不使用接受[FileOptions'](http://msdn.microsoft.com/)的[構造函數](http://msdn.microsoft.com/zh-cn/library/ms143396.aspx) EN-US /庫/ system.io.fileoptions。aspx)如果你通過'FileOptions.SequentialScan'來做到這一點?編輯:是的,它確實,通過參考源查看枚舉參數被轉換到'CreateFile'的'dwFlagsAndAttributes',並且枚舉的值是'0x08000000',它與'FILE_FLAG_SEQUENTIAL_SCAN'的值相同 – 2014-03-28 21:30:02

相關問題