【发布时间】:2010-12-12 10:06:25
【问题描述】:
如果您有兴趣,还向here on SO 提出了一个非常相似的问题,但我们将看到该问题的公认答案并非总是如此(而且我的应用程序使用模式也并非如此)。
性能确定代码由 FileStream 构造函数(用于打开文件)和 SHA1 哈希(.Net 框架实现)组成。该代码几乎是我在上面链接的问题中提出的问题的 C# 版本。
案例 1: 应用程序第一次或第 N 次启动,但设置了不同的目标文件。现在告诉应用程序计算以前从未访问过的文件的哈希值。
- ~50ms
- 80% FileStream 构造函数
- 18% 哈希计算
案例 2: 应用程序现在完全终止,然后重新启动,要求计算相同文件的哈希:
- ~8ms
- 90% 哈希计算
- 8% FileStream 构造函数
问题
我的应用程序一直在使用案例 1。永远不会要求它重新计算已经访问过一次的文件的哈希值。
所以我决定速率的步骤是 FileStream 构造函数!我能做些什么来加快这个用例的速度吗?
谢谢。
附:使用 JetBrains 分析器收集统计数据。
【问题讨论】:
-
我看到了完全相同的行为。使用 ReadAllBytes 并计算哈希需要很短的时间,但在内存上可能很糟糕(取决于文件的大小)。所以我尝试将 FileStream 传递给 MD5 的 computehash($stream) 并看到完全不可接受的结果。结果时间相差几个数量级......
-
@Alex K:从
FileStreamsource 看来,似乎有大量的预处理器指令,即使在最简单的路径中,初始化似乎也相当复杂。您可能想要指定您遇到问题的特定构造函数以及您的环境是什么样的,希望比我更聪明的人(很多)可以帮助您。 -
你是正确的多线程吗?是的,主轴是有限的,但是当一个一个访问大量小文件时,您可能会花费大部分时间等待数据,并且您可以通过多线程来加快速度(或在 SSD 中加快速度)。不是“极端”,但 2-3 个线程可能有助于减少停机时间。
-
需要更多信息。你究竟是如何调用构造函数的?你的论点是什么,它们是什么样的?绝对路径还是相对路径?您是否正在编写程序以减少/消除 JIT 开销?您是在有限信任场景中运行,还是您的应用程序具有完全信任?您是否尝试过使用
FileOptions.SequentialScan打开文件?您是否尝试过通过ProfileOptimization.StartProfile启用多核 jit? -
@antiduh 任何需要 10 秒的东西显然不是这些选项的功能,而是一个错误,我不希望得到修复。
标签: c# .net windows performance hard-drive