【发布时间】:2011-04-28 03:49:46
【问题描述】:
我需要按顺序读取(扫描)文件并处理其内容。 文件大小可以是非常小(一些 KB)到非常大(一些 GB)。
我在 Windows 7 64 位上使用 VC10/VS2010 尝试了两种技术:
- Win32 内存映射文件(即 CreateFile、CreateFileMapping、MapViewOfFile 等)
- fopen 并从 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一样正常吗?
谢谢。
【问题讨论】:
标签: c++ performance winapi memory-mapped-files