Производительность Win32 Памяти сопоставленные файлы против CRT Fopen / Fread
-
09-10-2019 - |
Вопрос
Мне нужно прочитать (сканировать) файл последовательно и обрабатывать его контент. Размер файла может быть чем-либо от очень маленького (некоторого КБ) до очень большой (какой-то ГБ).
Я пробовал два метода с использованием VC10 / VS2010 на Windows 7 64-бит:
- Win32 Файлы смягчания памяти (то есть CreateFile, CreatefileMapping, MapViewoffile и т. Д.)
- Fopen и Fhead от 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 в этом случае SCANNIG файла последовательно такой же, как CRT One?
Спасибо.
Решение
Я верю, что вы не увидите большую разницу, если вы подключите файл последовательно. Поскольку файл ввода / вывода очень сильно кэшируется, +, вероятно, также используется.
Дело будет отличаться, если у вас было много «прыжками» во время обработки файловых данных. Затем каждый раз, когда указывает новый указатель файла и чтение новой части файла, вероятно, убьет ЭЛТ, тогда как MMF даст вам максимально возможную производительность
Другие советы
Поскольку вы сканируете файл последовательно, я бы не ожидал, что шаблон использования диска будет сильно отличаться для любого метода.
Для больших файлов MMF может снизить местность данных и даже привести к копии всей или части файла, размещаемого в PageFile, тогда как обработка через CRT с использованием небольшого буфера будет иметь место в RAM. В этом случае MMF, вероятно, будет медленнее. Вы можете смягчить это, только сопоставление в части базового файла одновременно, но тогда все становится все более сложным без скорейшего выигрыша по прямым последовательным вводам / выходу.
MMF действительно так, как Windows реализует межпроцесс совместно используемую память, а не способ ускорить обобщенный файл ввода / вывода. Кэш файлового менеджера в ядре - это то, что вам действительно нужно использовать здесь.
Я думал, что методика файлов смягчания памяти может быть быстрее, чем функции CRT, но некоторые тесты показали, что скорость почти такая же в обоих случаях.
Вы, вероятно, ударяете кеш файловой системы для ваших тестов. Если вы явно не создаете ручки файла, чтобы обойти кеш файловой системы (FILE_FLAG_NO_BUFFERING
при звонке CreateFile
), кэш файловой системы ударит и сохраняет недавно доступные файлы в памяти.
Существует небольшая разница скорости между чтением файла, который находится в кэше файловой системы с включенной включенной буферией, поскольку операционная система должна выполнять дополнительную копию, а также накладные расходы на систему. Но для ваших целей, вы, вероятно, должны придерживаться функций файла CRT.
Gustavo Duarte имеет отличную статью о файлах отображения памяти (с общих перспективных ОС).
Оба метода в конечном итоге приступит к диску I / O, это будет ваше узкое место. Я бы пошел с одним методом, что мой более высокий уровень функционал любит больше - если мне нужно потоковое, я пойду с файлами, если мне нужен файлы последовательного доступа и фиксированные размеры, я бы рассмотрел файлы смягчания памяти.
Или, в случае, если у вас есть алгоритм, который работает только в памяти, то файлы memapape могут быть простым выходом.