使用和不使用 FILE_FLAG_NO_BUFFERING 的 NTFS 文件访问时间

NTFS file access time with and without FILE_FLAG_NO_BUFFERING

我正在尝试对 NTFS 的文件读取时间(顺序访问)进行基准测试。我的代码获取开始时间,执行大小等于 4096 字节(系统上 NTFS 的簇大小)的读取并记录结束时间。然后存储两个时间之间的差异,并重复该过程,直到到达文件末尾。我目前使用的文件大小是40K,所以得到10个时间差值。

访问未使用 FILE_FLAG_NO_BUFFERING 打开的文件(使用 CreateFile)时,第一个块的访问时间接近 30 微秒,后续访问下降到大约 7 微秒(由于缓存)。

使用FILE_FLAG_NO_BUFFERING时,第一个块的访问时间接近21毫秒,后续访问下降到175微秒左右。

第一个块访问时间是否应该与有或没有标志相同,因为它没有被缓冲?另外,为什么使用标志后访问时间会下降?我期望它们保持不变,因为我们已经指定我们不需要缓冲。

除了其他因素之外,访问时间还包括除实际数据传输时间之外的其他几个(较长的)因素。

这样的时间包括搜索目录结构(仅限第一次)以找到实际文件(这包括 'head seek' 时间(这很长,因为它需要磁头的物理移动),

然后是磁盘上正确扇区的旋转时间,

然后是实际的数据传输时间。

这之后是 'head seek' 时间到文件柱面的实际开始,

然后 'sector seek' 时间越过正确的扇区,

后面是实际的数据传输时间。

后续读取将不包括目录信息的访问。

任何访问都可以(但不总是)包括一些 'head seek' 时间(长度不同,取决于磁头当前所在的位置和所需数据当前所在的位置。

有了缓冲,后续访问时间大大减少(在大多数读取中),因为实际传输将包括多个扇区,因此只是偶尔需要实际访问磁盘。

当没有缓冲时,很大程度上取决于磁盘本身是否执行任何缓冲(现在,大多数执行本地缓冲)访问磁盘缓冲区中已经存在的数据消除了所有寻道时间(磁头和扇区)使传输更快。