我正在尝试对 NTFS 的文件读取时间(顺序访问)进行基准测试。我的代码获取开始时间,执行大小等于 4096 字节(系统上 NTFS 的簇大小)的读取并记录结束时间。然后存储两个时间之间的差异,并重复该过程,直到到达文件末尾。我目前使用的文件大小是40K,所以得到10个时差值。
当访问没有 FILE_FLAG_NO_BUFFERING
打开的文件(使用 CreateFile
)时,第一个 block 的访问时间接近 30 微秒,然后下降到大约 7 微秒用于后续访问(由于缓存)。
当使用 FILE_FLAG_NO_BUFFERING
时,第一个 block 的访问时间接近 21 毫秒,随后的访问时间下降到大约 175 微秒。
第一个 block 访问时间是否应该与有或没有标志相同,因为它没有被缓冲?另外,为什么使用标志后访问时间会下降?我期望它们保持不变,因为我们已经指定我们不需要缓冲。
最佳答案
除其他事项外,访问时间包括实际数据传输时间之外的其他几个(较长的)因素。
这样的时间包括搜索目录结构(仅限第一次)以找到实际文件(这包括“磁头搜索”时间(这很长,因为它需要磁头的物理移动),
然后是磁盘上正确扇区的旋转时间,
然后是实际的数据传输时间。
这之后是到文件柱面实际开始的“磁头搜索”时间,
然后是“扇区搜索”时间以越过正确的扇区,
后面是实际的数据传输时间。
后续读取将不包括访问目录信息。
任何访问都可以(但不总是)包括一些“寻头”时间(长度不同,取决于磁头当前所在的位置和所需数据当前所在的位置。
有了缓冲,后续访问时间会大大减少(在大多数读取中),因为实际传输将包括多个扇区,因此只是偶尔需要实际访问磁盘。
当没有缓冲时,很大程度上取决于磁盘本身是否执行任何缓冲(现在,大多数执行本地缓冲)访问已经在磁盘缓冲区中的数据消除了所有寻道时间(磁头和扇区)使得传输速度更快。
关于c - 使用和不使用 FILE_FLAG_NO_BUFFERING 的 NTFS 文件访问时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324100/