使用操作系统和磁盘缓冲区写入文件后,为什么读取操作快得多?

只有我

我正在使用CreateFile()依次将大约100个大小为50MB的文件写入磁盘上的目录WriteFile()在第二步中,使用CreateFile()读取这些文件的内容ReadFile()

我注意到了一些奇怪的事情:
如果我FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH在写文件时通过了,那么读取将花费很长的时间(通常为数百毫秒)。但是,当我不传递这些标志(而是使用标志FlushFileBuffers())时,写入似乎以大致相同的速度进行,但写入后读取这些文件的速度非常快(每个文件少于20毫秒!)。

这怎么可能?写入5000MB数据时传递的标志如何影响以后的读取?磁盘是否将整个5GB缓存在其缓存中?

戴维·赫弗南

通过时,FILE_FLAG_NO_BUFFERING您正在告诉系统不要将数据放入其磁盘缓存中。然后,当您读取数据时,系统必须从磁盘中获取数据。

省略时FILE_FLAG_NO_BUFFERING,系统可以将数据放入其磁盘缓存中。因此,当您随后读取数据时,可以直接从内存中读取数据,这比磁盘要快。

https://support.microsoft.com/zh-cn/kb/99794

CreateFile()的FILE_FLAG_WRITE_THROUGH标志使对该句柄的任何写操作都直接写入文件而不进行缓冲。数据被缓存(存储在磁盘缓存中);但是,它仍然直接写入文件中。此方法允许对该数据进行读取操作,以满足来自缓存数据的读取请求(如果仍然存在),而不必读取文件即可获取数据。直到将数据写入文件后,写调用才会返回。这也适用于远程写入-网络重定向器将FILE_FLAG_WRITE_THROUGH标志传递给服务器,以便服务器知道在将数据写入文件之前不满足写入请求。

FILE_FLAG_NO_BUFFERING使这一概念更进一步,并且消除了所有预读文件缓冲和磁盘缓存,从而确保所有读取均来自文件,而不是任何系统缓冲区或磁盘缓存。

您可能会从Raymond Chen那里找到有趣的文章:我们当前正在使用FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH,但是我们希望WriteFile更快摘录:

一位客户说,他们程序的I / O模式是打开一个文件,然后每隔一段时间将大约100KB的数据写入该文件中。他们当前正在使用FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH标志来打开文件,并且他们想知道还可以做些什么来使写入速度更快。

嗯,有一件事,您不再通过那两个标志!

这两个标志的组合基本上表示“给我尽可能慢的I / O性能!” 因为它们迫使所有I / O立即通过物理介质。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的Linux操作系统要比W10操作系统快得多,而W10可以做什么?

来自分类Dev

为什么<比!=快得多?

来自分类Dev

在这种情况下,为什么sed没有比opk快得多的操作

来自分类Dev

为什么ifstream :: read比使用迭代器快得多?

来自分类Dev

为什么在Image上旋转比使用BitmapEncoder快得多?

来自分类Dev

为什么StringBuilder比String快得多

来自分类常见问题

为什么字典比列表快得多?

来自分类Dev

为什么PreparedStatement比Statement快得多?

来自分类Dev

为什么熊猫.isin比“ in”快得多?

来自分类Dev

利用缓冲区溢出读取操作

来自分类Dev

操作系统如何处理外围数据缓冲区?

来自分类Dev

Android:为什么本机代码比Java代码快得多

来自分类Dev

为什么EnumerateFiles比计算大小要快得多

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

Python清单:为什么.sort()比sorted()快得多?

来自分类Dev

为什么批处理模式比parfor快得多?

来自分类Dev

为什么strcmp比我的函数快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么Python中的这段代码比C ++快得多?

来自分类Dev

为什么SSH感觉比HTTP快得多?

来自分类Dev

为什么strcmp比我的函数快得多?

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么子图比图快得多?

来自分类Dev

为什么wget比通过Chrome下载要快得多?

来自分类Dev

为什么认为异步代码比同步代码快得多?

来自分类Dev

为什么fio seq_writes比dd快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

Related 相关文章

  1. 1

    为什么我的Linux操作系统要比W10操作系统快得多,而W10可以做什么?

  2. 2

    为什么<比!=快得多?

  3. 3

    在这种情况下,为什么sed没有比opk快得多的操作

  4. 4

    为什么ifstream :: read比使用迭代器快得多?

  5. 5

    为什么在Image上旋转比使用BitmapEncoder快得多?

  6. 6

    为什么StringBuilder比String快得多

  7. 7

    为什么字典比列表快得多?

  8. 8

    为什么PreparedStatement比Statement快得多?

  9. 9

    为什么熊猫.isin比“ in”快得多?

  10. 10

    利用缓冲区溢出读取操作

  11. 11

    操作系统如何处理外围数据缓冲区?

  12. 12

    Android:为什么本机代码比Java代码快得多

  13. 13

    为什么EnumerateFiles比计算大小要快得多

  14. 14

    为什么memcmp比for循环检查要快得多?

  15. 15

    Python清单:为什么.sort()比sorted()快得多?

  16. 16

    为什么批处理模式比parfor快得多?

  17. 17

    为什么strcmp比我的函数快得多?

  18. 18

    为什么在预热阶段浮点运算要快得多?

  19. 19

    为什么数组的直接索引比迭代快得多?

  20. 20

    为什么Python中的这段代码比C ++快得多?

  21. 21

    为什么SSH感觉比HTTP快得多?

  22. 22

    为什么strcmp比我的函数快得多?

  23. 23

    为什么memcmp比for循环检查要快得多?

  24. 24

    为什么在预热阶段浮点运算要快得多?

  25. 25

    为什么子图比图快得多?

  26. 26

    为什么wget比通过Chrome下载要快得多?

  27. 27

    为什么认为异步代码比同步代码快得多?

  28. 28

    为什么fio seq_writes比dd快得多?

  29. 29

    为什么数组的直接索引比迭代快得多?

热门标签

归档