代码之家  ›  专栏  ›  技术社区  ›  Pete

在.NET中是否加载了文件流延迟?

  •  2
  • Pete  · 技术社区  · 17 年前

    我有一个关于在.NET中使用流从磁盘加载文件的问题。我试图找出一个性能问题,并确定它在我认为的地方。

    Dim provider1 As New MD5CryptoServiceProvider
    Dim stream1 As FileStream
    
    stream1 = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
    provider1.ComputeHash(stream1)
    

    问:当我创建文件流对象时,或者当使用流的对象(在本例中是MD5哈希算法)实际读取该对象时,是否从磁盘读取字节?

    当使用 ComputeHash 方法,与本地测试环境进行比较。我只是想确保性能问题在散列中,而不是在磁盘访问中。

    3 回复  |  直到 17 年前
        1
  •  2
  •   Chris Wenham    17 年前

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

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

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

    provider1.ComputeHash(stream1.ToArray());
    

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

        2
  •  0
  •   MichaelT    17 年前

    是的,将读取该文件的内容,然后运行computehash方法,而不是在刚打开文件流时。

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

        3
  •  0
  •   Dario Solera    17 年前

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

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