2

我有一个关于在 .NET 中使用流从磁盘加载文件的问题。我试图查明一个性能问题,并想确定它是我认为的位置。

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与我的本地测试环境相比,我在使用该方法时在我的网络主机上发现了严重的性能问题。我只是想确保性能问题出在散列而不是磁盘访问中。

4

3 回答 3

2

FileStream 只是在文件对象周围公开一个 IO.Stream,并使用缓冲区。它不会在构造函数中读取整个文件(文件可能大于 RAM)。

性能问题最有可能出现在哈希中,您可以执行一些简单的基准测试来证明是因为文件 IO 还是算法本身。

但是您可能会尝试的第一件事是:

provider1.ComputeHash(stream1.ToArray());

这应该使 FileStream 读取整个文件并返回一个字节数组。.ToArray() 可以调用比 ComputeHash 调用的 .Read() 方法更快的方法。

于 2008-09-18T15:40:19.823 回答
0

是的,文件的内容将在您运行 ComputeHash 方法时读取,而不是在您打开 FileStream 时读取。

测试性能问题的最佳方法是从文件读取数据到内存流对其进行哈希处理并测量每个步骤的性能。您可以为此使用 System.Diagnostics.Stopwatch 类。

于 2008-09-18T15:35:53.530 回答
0

当调用者通过调用 Read 或类似方法请求它们时,应从磁盘读取字节。无论如何,硬盘和操作系统都会执行一些预读来改进顺序读取操作,但这肯定很难预测。

您还可以尝试使用某些构造函数重载为 FileStream 提供的缓冲区大小参数。

于 2008-09-18T15:37:22.433 回答