Мне нужно последовательно прочитать (отсканировать) файл и обработать его содержимое.Размер файла может быть от очень маленького (несколько КБ) до очень большого (несколько ГБ).
Я попробовал два метода, используя VC10 / VS2010 в 64-разрядной версии Windows 7:
- Файлы сопоставления памяти 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?
Спасибо.