我正在使用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] 删除。
我来说两句