Подтвердить что ты не робот

Какой размер идеального буфера?

Возможный дубликат:
Как вы определяете идеальный размер буфера при использовании FileInputStream?

При чтении необработанных данных из файла (или любого входного потока) с использованием семейства С++ istream read() или C fread() необходимо предоставить буфер и количество данных, которые нужно прочитать. Большинство программ, которые я видел, по-видимому, произвольно выбрали мощность 2 между 512 и 4096.

  • Есть ли причина, по которой она должна/должна быть силой 2, или это просто естественный склонность программиста к степеням 2?
  • Каким будет "идеальный" номер? Под "идеалом" я подразумеваю, что это будет самый быстрый. Я предполагаю, что он должен быть кратным размеру буфера базового устройства? Или, может быть, базового буфера объектов потока? Как бы я определил, какой размер этих буферов, во всяком случае? И как только я это сделаю, будет ли использование нескольких из них дать увеличение скорости только при использовании точного размера?

ИЗМЕНИТЬ
Большинство ответов, похоже, не могут быть определены во время компиляции. Я в порядке с поиском его во время выполнения.

4b9b3361

Ответ 1

ИСТОЧНИК:
Как вы определяете идеальный размер буфера при использовании FileInputStream?

Оптимальный размер буфера связан с рядом вещей: файловая система размер блока, размер кэша процессора и латентность кэша.

В большинстве файловых систем используются размеры блоков 4096 или 8192. Теоретически, если вы настроите свой размер буфера, чтобы вы читали несколько байтов больше, чем блок диска, операции с файловой системой может быть крайне неэффективным (т.е. если вы настроили свой буфер на читать 4100 байт за раз, для каждого считывания требуется 2 блока чтения файловая система). Если блоки уже находятся в кеше, то вы завершаете оплачивая стоимость ОЗУ → латентность кэша L3/L2. Если вам не повезло и блоки еще не находятся в кеше, вы платите цену за disk- > RAM latency.

Вот почему вы видите большинство буферов размером от 2 и вообще больше (или равно) размера блока диска. Это означает, что один из чтение вашего потока может привести к чтению нескольких блоков блоков - но эти чтения всегда будут использовать полный блок - без потерь.

Обеспечение этого также обычно приводит к другим дружественным параметрам, влияющим как на чтение, так и на последующую обработку: выравнивание ширины шины данных, выравнивание DMA, выравнивание строки кэша памяти, целых страниц виртуальной памяти.

Ответ 2

  • По крайней мере, в моем случае предположение заключается в том, что базовая система использует буфер, размер которого также равен двум, поэтому лучше всего попробовать и сопоставить. Я думаю, что в настоящее время буферы должны быть немного больше, чем то, что "большинство" программистов имеют тенденцию делать. Например, я бы пошел с 32 КБ, а не 4.
  • Очень сложно заранее знать, к сожалению. Это зависит от того, относится ли ваше приложение к I/O или CPU.

Ответ 3

  • Я думаю, что в основном он просто выбирает "круглый" номер. Если бы компьютеры работали в десятичной системе, мы бы выбрали 1000 или 10000 вместо 1024 или 8192. Не существует веских оснований.

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

Ответ 4

Нет причин, по которым я знаю, что это должна быть сила двух. Вы ограничены размером буфера, который должен быть в пределах max size_t, но это вряд ли будет проблемой.

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

Ответ 5

1. Есть ли причина, по которой она должна/должна быть силой 2, или это просто естественный склонность программиста к степеням 2?

Не совсем. Вероятно, это должно быть что-то, что даже в размере ширины шины данных, чтобы упростить копирование памяти, поэтому все, что попадает в 16, было бы хорошо с текущей технологией. Использование мощности 2 делает возможным, что он будет хорошо работать с любой будущей технологией.

2. Какой будет "идеальный" номер? Под "идеалом" я подразумеваю, что это будет самый быстрый.

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

Я предполагаю, что он должен быть кратным размер буфера устройства? Или, может быть, основного потока буфер объекта? Как определить размер этих буферов во всяком случае?

Вы не можете знать размер базовых буферов или быть в зависимости от того, что они остаются теми же.

И как только я это сделаю, использовал бы несколько кратных, чтобы дать любую скорость увеличить только с помощью точного размера?

Некоторые, но очень маленькие.

Ответ 6

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