Улучшенная буферизация улучшает максимальную скорость ifstream.getline () в C ++? - PullRequest
1 голос
/ 24 февраля 2012

Непосредственно перед использованием MSVC ++ input.getline () для чтения очень большого (3 ГБ) текстового файла с разделителями я хотел оптимизировать скорость, увеличив размер входного буфера:

    ifstream input("in1.txt");
    input.rdbuf()->pubsetbuf(NULL, 1024 * 1024);

Однако,при выполнении кода скорость не улучшалась, поэтому хотелось бы знать:

  • Что не так в коде?
  • Работает ли буферизация с ifstream.getline?
  • Каков размер буферизации по умолчанию, назначенной для ifstream?

С уважением.

Ответы [ 5 ]

3 голосов
/ 24 февраля 2012

Рассматривали ли вы системный вызов mmap ()?

Функция mmap () должна установить соответствие между процессом адресное пространство и файл, объект общей памяти или типизированная память объект. Формат звонка следующий:

pa = mmap (addr, len, prot, flags, fildes, off);

справочная страница

MapViewOfFile - это эквивалент Windows.

LPVOID WINAPI MapViewOfFile (__in HANDLE hFileMappingObject,
__in DWORD dwDesiredAccess, __in DWORD dwFileOffsetHigh, __in DWORD dwFileOffsetLow, __in SIZE_T dwNumberOfBytesToMap);

0 голосов
/ 24 февраля 2012

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

0 голосов
/ 24 февраля 2012

Вы получите абсолютную максимальную производительность, используя CreateFile и ReadFile. Откройте файл с помощью FILE_FLAGS_SEQUENTIAL_SCAN.

Чтение с размером буфера, равным степени двойки. Только бенчмаркинг может определить это число. Я видел, что это было 8K один раз. В другой раз я обнаружил, что это 8M! Это сильно варьируется.

Это зависит от размера кэша ЦП, от эффективности опережающего чтения ОС и от накладных расходов, связанных с выполнением множества небольших операций записи.

Отображение памяти не самый быстрый способ. У него больше накладных расходов, потому что вы не можете контролировать размер блока, и ОС должна отказывать на всех страницах.

0 голосов
/ 24 февраля 2012

Я хотел оптимизировать скорость

Избавиться от fstream.В общем, iostreams - это ужасное узкое место.

0 голосов
/ 24 февраля 2012

Суть буферизации в том, что она работает на многих уровнях, у вас есть буферизация на уровне библиотеки (ifstream), у вас буферизация на уровне ОС и буферизация на аппаратном уровне.Изменение размера любого из них может оказать значительное или несущественное влияние на производительность.

Что правда, так это то, что «логика» программы будет намного быстрее, чем логика ввода-вывода.

Лично, если горлышко бутылки не серьезное, я бы оставил это так.

...