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()方法更快。