FileStream在应用程序冷启动时速度很慢

问题描述:

如果您有兴趣,也会询问一个非常类似的问题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

文件系统和/或磁盘控制器将缓存最近访问过的文件/扇区。

确定速度的步骤是读取文件,而不是构建FieStream对象,并且当数据在缓存中时,在第二次运行时它将显着更快,这是完全正常的。

+0

我不相信这是这种情况。 FileStream构造函数不读取整个文件,哈希函数为此调用。但是,构造函数需要80%的时间。 – 2009-11-02 21:14:12

你应该尽量使用本地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