¿El archivo mapeado en memoria es más rápido en una lectura secuencial enorme? ¿Por qué
Usé el siguiente código para medir la diferencia de rendimiento entre leergrande, secuencial lecturas de un archivo mapeado en memoria, en comparación con solo llamar aReadFile
:
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); }
(Acabo de cambiar el valor deTEST_READ_FILE
para cambiar la prueba.)
Para mi sorpresa,ReadFile
fuemás lent por ~ 20%! ¿Por qué