Поиск оптимального размера для BufferedInputStream в Java

Я профилировал свой код, загружающий двоичный файл. Время загрузки было около 15 секунд.

Большую часть моего времени загрузки приходилось на методы, загружающие двоичные данные.

У меня был следующий код для создания моего DataInputStream:

is = new DataInputStream(
     new GZIPInputStream(
     new FileInputStream("file.bin")));

И я изменил его на этот:

is = new DataInputStream(
     new BufferedInputStream(
     new GZIPInputStream(
     new FileInputStream("file.bin"))));

Итак, после того, как я сделал эту небольшую модификацию, код загрузки изменился с 15 секунд до 4.

Но потом я обнаружил, что BufferedInputStream имеет два конструктора. Другой конструктор позволяет вам явно определять размер буфера.

У меня два вопроса:

  1. Какой размер выбран в BufferedInputStream и идеален ли он? Если нет, как мне найти оптимальный размер буфера? Стоит ли написать небольшой фрагмент кода, выполняющего двоичный поиск?
  2. Это лучший способ использования BufferedInputStream? Изначально он был у меня в GZIPInputStream, но польза была ничтожна. Я предполагаю, что код сейчас делает то, что каждый раз, когда необходимо заполнить файловый буфер, входной поток GZIP проходит и декодирует x байтов (где x - размер буфера). Стоит ли полностью исключить GZIPInputStream? Это определенно не нужно, но при его использовании размер моего файла резко уменьшается.
5
задан Brad 14 December 2010 в 10:22
поделиться