diff --git a/akka-stream/src/main/scala/akka/stream/impl/io/compression/DeflateDecompressorBase.scala b/akka-stream/src/main/scala/akka/stream/impl/io/compression/DeflateDecompressorBase.scala index 98d05f5b83..2091b72252 100644 --- a/akka-stream/src/main/scala/akka/stream/impl/io/compression/DeflateDecompressorBase.scala +++ b/akka-stream/src/main/scala/akka/stream/impl/io/compression/DeflateDecompressorBase.scala @@ -21,12 +21,19 @@ import akka.util.ByteString def afterBytesRead(buffer: Array[Byte], offset: Int, length: Int): Unit def inflating: Inflate + /** + * Pre-allocated buffer to read from inflater. ByteString.fromArray below + * will always create a copy of the read data. Keeping this fixed + * buffer around avoids reallocating a buffer that may be too big in many + * cases for every call of `parse`. + */ + private[this] val buffer = new Array[Byte](maxBytesPerChunk) + abstract class Inflate(noPostProcessing: Boolean) extends ParseStep[ByteString] { override def canWorkWithPartialData = true override def parse(reader: ByteStringParser.ByteReader): ParseResult[ByteString] = { inflater.setInput(reader.remainingData.toArray) - val buffer = new Array[Byte](maxBytesPerChunk) val read = inflater.inflate(buffer) reader.skip(reader.remainingSize - inflater.getRemaining)