Win32内存映射文件与CRT fopen/fread的性能

Emb*_*rog 13 c++ performance winapi memory-mapped-files

我需要按顺序读取(扫描)文件并处理其内容.文件大小可以是从非常小(某些KB)到非常大(某些GB)的任何内容.

我尝试在Windows 7 64位上使用VC10/VS2010的两种技术:

  1. Win32内存映射文件(即CreateFile,CreateFileMapping,MapViewOfFile等)
  2. 来自CRT的fopen和fread.

我认为内存映射文件技术可能比CRT函数更快,但是一些测试显示两种情况下的速度几乎相同.

以下C++语句用于MMF:

HANDLE hFile = CreateFile(
    filename,
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_SEQUENTIAL_SCAN,
    NULL
    );

HANDLE hFileMapping = CreateFileMapping(
    hFile,
    NULL,
    PAGE_READONLY,
    0,
    0,
    NULL
    );
Run Code Online (Sandbox Code Playgroud)

按顺序读取文件,按块查看; 每个块SYSTEM_INFO.dwAllocationGranularity的大小.

考虑到MMF和CRT的速度几乎相同,我使用CRT功能,因为它们更简单,更多平台.但我很好奇:我是否正确使用MMF技术?在这种情况下,扫描文件的MMF性能顺序与CRT相同,这是正常的吗?

谢谢.

val*_*ldo 14

我相信如果按顺序访问文件,你看不会有多大区别.由于文件I/O被高度缓存,因此可能也会使用+预读.

如果你在文件数据处理过程中有很多"跳跃",那就会有所不同.然后,每次设置新文件指针并读取新文件部分可能会杀死CRT,而MMF将为您提供最大可能的性能