与仅调用ReadFile相比,我使用下面的代码来衡量读取内存映射文件的大型顺序读取之间的性能差异: HANDLE hFile = CreateFile(_T("D:\\LARGE_ENOUGH_FILE"), FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NUL
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%!为什么?
FILE_FLAG_NO_BUFFERING致残ReadFile.内存映射文件可以自由使用它想要的任何预读算法,并且您已禁止ReadFile执行相同的操作.您只在ReadFile版本中关闭了缓存.没有文件缓存,内存映射文件无法工作.