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