我需要按顺序读取(扫描)文件并处理其内容。文件大小可以从非常小(一些 KB)到非常大(一些 GB)。
我在 Windows 7 64 位上使用 VC10/VS2010 尝试了两种技术:
- Win32 内存映射文件(即 CreateFile、CreateFileMapping、MapViewOfFile 等)
- fopen 和 fread 从 CRT。
我认为内存映射文件技术可能比 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
);
文件被顺序读取,逐块读取;每个块SYSTEM_INFO.dwAllocationGranularity
的大小。
考虑到 MMF 和 CRT 的速度几乎相同,我会使用 CRT 函数,因为它们更简单且多平台。但我很好奇:我是否正确使用了 MMF 技术?在这种顺序扫描文件的情况下,MMF 性能与 CRT 相同是否正常?
谢谢。