В настоящее время у меня есть проблема, что этот кусок кода будет называться> 500 тыс. Раз. Размер сжатого byte[]
составляет менее 1 КБ. Каждый раз, когда вызывается метод, все потоки должны быть созданы. Поэтому я ищу способ улучшить этот код.Как улучшить производительность GZIP
private byte[] unzip(byte[] data) throws IOException, DataFormatException {
byte[] unzipData = new byte[4096];
try (ByteArrayInputStream in = new ByteArrayInputStream(data);
GZIPInputStream gzipIn = new GZIPInputStream(in);
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
int read = 0;
while((read = gzipIn.read(unzipData)) != -1) {
out.write(unzipData, 0, read);
}
return out.toByteArray();
}
}
Я уже tried заменить ByteArrayOutputStream
с ByteBuffer
, но в момент создания я не знаю, сколько байт мне нужно выделить.
Кроме того, я пытался использовать Inflater
, но я наткнулся на описанную проблему here.
Любая другая идея, что я мог бы сделать, чтобы улучшить производительность этого кода.
Попробуйте увеличить размер буфера 'unzipData'. 4096 не очень большой, и я подозреваю, что он увеличит его, что позволит вам писать больше данных с меньшим количеством вызовов для записи. – GiantTree
@GiantTree OP заявила, что 'data' составляет менее 1 КБ, поэтому увеличение размера буфера будет пустой, – Andreas
@ Andreas Я просто просмотрел текст; вы правы, это не поможет с точки зрения производительности. Он мог передать 'новый ByteArrayInputStream (data)' непосредственно в 'новый GZIPInputStream', не создавая промежуточного InputStream. – GiantTree