Как вы решаете, какой размер байта [] использовать для InputStream.read ()? - PullRequest
32 голосов
/ 06 января 2012

При чтении из InputStreams, как вы решаете, какой размер использовать для байта []?

int nRead;
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about

while ((nRead = is.read(data, 0, data.length)) != -1) {
  ...do something..
}

Когда вы используете маленький против большого? Какие есть отличия? Число хочет быть с шагом 1024? Имеет ли значение, если это InputStream из сети против диска?

Большое спасибо, я не могу найти четкого ответа в другом месте.

Ответы [ 4 ]

22 голосов
/ 06 января 2012

Большинство людей используют полномочия 2 для размера. Если размер буфера составляет не менее 512 байт, это не имеет большого значения (<20%) </p>

Для сети оптимальный размер может составлять от 2 КБ до 8 КБ (размер базового пакета обычно составляет до ~ 1,5 КБ). Для доступа к диску самый быстрый размер может составлять от 8 КБ до 64 КБ. Если вы используете 8K или 16K, у вас не будет проблем.

Обратите внимание, что при загрузке по сети вы, скорее всего, обнаружите, что обычно не используете весь буфер. Потеря нескольких КБ не имеет большого значения для 99% случаев использования.

3 голосов
/ 06 января 2012

В этой ситуации я всегда использую разумную мощность 2, где-то в диапазоне от 2K до 16K. Как правило, разные InputStreams будут иметь разные оптимальные значения, но нет простого способа определить это значение.

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

Беспокойство об этом, вероятно, является причиной преждевременной оптимизации.

3 голосов
/ 06 января 2012

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

Я лично пытаюсь использовать библиотеку и снять задачу выбора размера буфера для авторов библиотеки. После этого я обещаю себе никогда не читать код библиотеки, потому что это меня бесит.

1 голос
/ 06 января 2012

С помощью метода available() в классе InputStream. Из Javadoc:

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

...