Будет ли размер буфера влиять на временные затраты при чтении файлов? - PullRequest
1 голос
/ 22 июня 2011

У меня есть две опции относительно размера буфера при чтении файлов.

char* buffer = new char[aBlock];
myFile.read(buffer,aBlock);

и

char* buffer = new char;
while (!myFIle.eof())
    myFile.read(buffer,1);

Будет ли существенная разница во времени? Имейте в виду, что в качестве буфера я имею в виду char* buffer в коде, я не говорю о файловых буферах ОС

Ответы [ 5 ]

5 голосов
/ 22 июня 2011

Да, будет.Во всех практических операционных системах цена выполнения ввода-вывода несколько выше, чем компромисс с меньшим объемом доступной памяти.Практические размеры буфера намного меньше, чем можно было бы ожидать.Размер буфера по умолчанию для библиотеки времени выполнения C для FILE *, равный 512 байтам, довольно хорош - действительно хорош для множества ситуаций, в которых он используется.И это было разработано для 65 536 байт памяти в Unix V6 (c. 1978).

Тщательное измерение пропускной способности, загрузки процессора и общей загрузки системы для оптимизации размера буфера всегда заставляло меня выбирать размер буфера вдиапазон от 1024 до 16384 байтов.Единственное исключение - файлы, размер которых немного превышает этот диапазон, и в этом случае оптимально хранить весь файл в памяти, когда память доступна.

1 голос
/ 22 июня 2011

Вы уже будете читать в буфере, так как он не читает напрямую из файла в буфер, который вы поместили в вызов read, но сначала перейдет в буфер внутри fstream (filebuf).

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

1 голос
/ 22 июня 2011

Библиотека времени выполнения буферизует для вас.Дополнительные затраты здесь заключаются в выполнении одних и тех же инструкций снова и снова для чтения одного байта по сравнению с заблокированным чтением.Количество вызовов в aBlock раз больше, если вы читаете по одному байту за раз.

0 голосов
/ 07 сентября 2012

Существует огромная разница, в зависимости от реализации.В Visual C ++ 2008 есть критический раздел, который вводится при каждом вызове read ().Таким образом, второй набор кода в вопросе будет вводить «aBlock» более критических разделов, чем первый набор кода.

0 голосов
/ 22 июня 2011

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

...