FileStream是否是在.NET中延迟加载的?

时间:2020-03-06 14:21:55  来源:igfitidea点击:

我有一个关于在.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方法时,我在Web主机上发现了严重的性能问题。我只是想确保性能问题是在散列中,而不是在磁盘访问中。

解决方案

是的,将读取文件的内容,然后我们运行ComputeHash方法,而不是仅在打开FileStream时运行。

测试性能问题出在哪里的最好方法是,将数据从文件读取到内存流中并对其进行哈希处理,并评估每个步骤的性能。我们可以为此使用System.Diagnostics.Stopwatch类。

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

我们也可以尝试使用某些构造函数重载为FileStream提供的buffer size参数。

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

性能问题最有可能出现在散列中,我们可以执行一些简单的基准测试以证明这是由于文件IO还是算法本身引起的。

但是,我们可以尝试的第一件事是:

provider1.ComputeHash(stream1.ToArray());

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