Производительность Win32 Памяти сопоставленные файлы против CRT Fopen / Fread

StackOverflow https://stackoverflow.com/questions/3980035

Вопрос

Мне нужно прочитать (сканировать) файл последовательно и обрабатывать его контент. Размер файла может быть чем-либо от очень маленького (некоторого КБ) до очень большой (какой-то ГБ).

Я пробовал два метода с использованием VC10 / VS2010 на Windows 7 64-бит:

  1. Win32 Файлы смягчания памяти (то есть CreateFile, CreatefileMapping, MapViewoffile и т. Д.)
  2. 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 могут быть простым выходом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top