使用FILE_FLAG_NO_BUFFERING将返回明显的速度增益?

时间:2011-01-01 17:49:36

标签: performance winapi file-io

最近注意到MSDN中FILE_FLAG_NO_BUFFERING标志的详细说明,并阅读了几个关于Windows中无缓冲I / O的Google搜索结果。

http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx

我现在想知道,在文件I / O编程中考虑无缓冲选项是否真的很重要?因为许多程序使用普通的旧C流I / O或C ++ iostream,所以我之前没有注意过FILE_FLAG_NO_BUFFERING标志。

假设我们正在开发像Picasa这样的照片浏览器程序。如果我们实现无缓冲的I / O,缩略图显示速度是否会在普通用户中显示出明显的差异?

4 个答案:

答案 0 :(得分:13)

哦,主啊不。使用该标志可以大大降低速度。它绕过了文件系统缓存,这段精彩的代码可以用几乎精神的精确度来猜测你读取N后你想要读取扇区N + 1.如果它便宜就可以预先加载它。

写入特别糟糕,这就是选项存在的原因,你没有得到懒惰的回写。这意味着您的程序只能以磁盘可写的速度运行。这非常非常慢。旗帜的优点是你可以确定它是写的。帮助实现事务磁盘更新,这是dbase引擎关心的类型。

但请亲自尝试看看效果。

答案 1 :(得分:7)

不,此标志不适用于典型的磁盘用户。它适用于像数据库这样的程序,它们需要执行自己的文件缓存管理以获得最佳性能。虽然我确信你可以找到加速你的程序的情况,但大多数情况下你会想要使用操作系统提供的缓冲 - 这就是它存在的原因。

答案 2 :(得分:1)

我最近对此进行了实验。由于我已经在进行自己的缓冲区管理(实现解析器中常用的缓冲区对),因此我认为FILE_FLAG_NO_BUFFERING可以避免多余的副本,从而有所帮助。我尝试了不同的(页面对齐的)缓冲区大小,但是它总是比不使用标志要慢。

由于我的计划涉及一次读取整个文件,因此我尝试使用FILE_FLAG_SEQUENTIAL_SCAN,这实际上有所帮助。

当禁用缓冲时,您将无法获得操作系统使用的预取和其他缓存技巧。当您提供正确的“提示”(例如FILE_FLAG_SEQUENTIAL_SCAN)时,您将充分利用这些操作系统功能。

答案 3 :(得分:0)

从快速SSD读取大于RAM的文件可以从此选项中受益,因为该文件无论如何都不适合高速缓存,并且直接IO可以防止开销不断地影响高速缓存。这意味着,如果您为大型照片和视频集创建数千个缩略图,则在某些情况下这可能是有道理的。