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

时间:2008-09-18 15:29:38

标签: .net performance

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

3 个答案:

答案 0 :(得分:2)

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

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

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

provider1.ComputeHash(stream1.ToArray());

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

答案 1 :(得分:0)

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

测试性能问题所在的最佳方法是,将数据从文件读取到内存流并对其进行散列并测量每个步骤的性能。您可以使用System.Diagnostics.Stopwatch类。

答案 2 :(得分:0)

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

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