Я профилировал свой код, загружающий двоичный файл. Время загрузки составляло примерно 15 секунд.Поиск оптимального размера для BufferedInputStream в Java
Большая часть времени загрузки приходила на методы, которые загружали двоичные данные.
я имел следующий код, чтобы создать свой DataInputStream:
is = new DataInputStream(
new GZIPInputStream(
new FileInputStream("file.bin")));
И я изменил его к этому:
is = new DataInputStream(
new BufferedInputStream(
new GZIPInputStream(
new FileInputStream("file.bin"))));
После того как я сделал эту небольшую модификацию кода загрузки пошла от 15 секунд до 4.
Но потом я обнаружил, что BufferedInputStream имеет два конструктора. Другой конструктор позволяет явно определить размер буфера.
У меня есть два вопроса:
- Какой размер выбран в BufferedInputStream и он идеально? Если нет, как я могу найти оптимальный размер для буфера? Должен ли я написать быстрый бит кода, который выполняет двоичный поиск?
- Является ли это лучшим способом использования BufferedInputStream? Первоначально я использовал его в GZIPInputStream, но была невыносимая польза. Я предполагаю, что код делает сейчас - каждый раз, когда необходимо заполнять буфер файла, входной поток GZIP проходит и декодирует x байты (где x - размер буфера). Стоит ли просто полностью исключать GZIPInputStream? Это определенно не нужно, но размер файла значительно уменьшается при его использовании.
Я предлагаю вам попробовать буфер 64K для GZIPInputStream при чтении с диска. Я использую 1 МБ, что, вероятно, будет более чем необходимо. ;) –