我使用下面的代码来衡量内存映射文件进行大规模顺序读取与仅调用ReadFile
之间性能差异:
HANDLE hFile = CreateFile(_T("D:\\LARGE_ENOUGH_FILE"),
FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING, NULL);
__try
{
const size_t TO_READ = 32 * 1024 * 1024;
char sum = 0;
#if TEST_READ_FILE
DWORD start = GetTickCount();
char* p = (char*)malloc(TO_READ);
DWORD nw;
ReadFile(hFile, p, TO_READ, &nw, NULL);
#else
HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY,
0, 0, NULL);
const char* const p = (const char*)MapViewOfFile(hMapping,
FILE_MAP_READ, 0, 0, 0);
DWORD start = GetTickCount();
#endif
for (size_t i = 0; i < TO_READ; i++)
{
sum += p[i]; // Do something kind of trivial...
}
DWORD end = GetTickCount();
_tprintf(_T("Elapsed: %u"), end - start);
}
__finally { CloseHandle(hFile); }
我刚刚更改了TEST_READ_FILE
的值来更改测试。
令我惊讶的是,ReadFile
的速度慢了约20%!为什么?
malloc
会极大地扭曲结果,因为强制每个页面都被提交以减慢速度。无论这是否公平,我都不确定……我可以反驳任何一种观点。(例如,由于文件映射不需要malloc
,你可以认为这是你必须考虑的额外负担。) - user541686