Производительность сопоставленных файлов памяти Win32 и CRT fopen / fread - PullRequest
13 голосов
/ 20 октября 2010

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

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

  1. Файлы сопоставления памяти Win32 (т. Е. CreateFile, CreateFileMapping, MapViewOfFile и т. Д.)
  2. 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?

Спасибо.

Ответы [ 4 ]

14 голосов
/ 20 октября 2010

Полагаю, вы не увидите большой разницы, если будете обращаться к файлу последовательно. Поскольку файловый ввод / вывод очень сильно кэшируется, вероятно, также используется + упреждающее чтение.

Все было бы иначе, если бы у вас было много «скачков» во время обработки данных файла. Затем, каждый раз, устанавливая новый указатель файла и читая новую часть файла, вероятно, будет убивать CRT, тогда как MMF даст вам максимально возможную производительность

4 голосов
/ 20 октября 2010

Поскольку вы сканируете файл последовательно, я бы не ожидал, что схема использования диска будет сильно отличаться для обоих методов.

Для больших файлов MMF может уменьшить локальность данных и даже привести к тому, что копия всего или части файла будет помещена в файл подкачки, тогда как обработка с помощью CRT с использованием небольшого буфера будет происходить в ОЗУ. В этом случае MMF, вероятно, будет медленнее. Вы можете уменьшить это, отображая только часть базового файла за раз, но тогда все усложняется без какой-либо вероятной победы над прямым последовательным вводом / выводом.

MMF - это действительно способ, которым Windows реализует межпроцессную совместную память, а не способ ускорить обобщенный файловый ввод-вывод. Кэш файлового менеджера в ядре - это то, что вам действительно нужно использовать здесь.

2 голосов
/ 20 октября 2010

Я думал, что метод отображения файла памяти может быть быстрее, чем функции CRT, но некоторые тесты показали, что скорость почти одинакова в обоих случаях.

Возможно, вы попали в файлсистемный кеш для ваших тестов.Если вы явно не создадите файловые дескрипторы, чтобы обойти кеш файловой системы (FILE_FLAG_NO_BUFFERING при вызове CreateFile), кэш файловой системы сработает и сохранит недавно использованные файлы в памяти.между чтением файла, который находится в кеше файловой системы с включенной буферизацией, поскольку операционная система должна выполнить дополнительное копирование, а также накладными расходами системного вызова.Но для ваших целей вам, вероятно, следует придерживаться функций файла CRT.

У Густаво Дуарте есть отличная статья о файлах с отображением в памяти (с точки зрения общей ОС).

1 голос
/ 20 октября 2010

Оба метода в конечном итоге сводятся к дисковому вводу-выводу, что станет вашим узким местом.Я бы выбрал один метод, который больше нравится моей функциональности более высокого уровня - если мне нужна потоковая передача, я пойду с файлами, если мне понадобится последовательный доступ и файлы фиксированного размера, я рассмотрю файлы с отображением в памяти.Или, в случае если у вас есть алгоритм, который работает только с памятью, файлы с отображенными мемами могут быть проще.

...