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

标签 c windows time ntfs

我正在尝试对 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/

相关文章:

c - 是否可以循环接收/读取以从套接字读取所有数据

c - 如何使我的代码按升序对输入进行排序?

c - time_t 的转换如何在 C 中工作?

c++ - 基于单元框架的算法性能测试的可靠性

c - gcc 5编译fork()返回父pid 0吗?

c - 指向 C 中结构中的结构的指针

c++ - OpenCV - 我如何开始?

windows - Visual C++和并发线程..为什么会这样?

windows - win32自定义内存管理有什么限制?

python - Python:从给定时间播放音频文件