From ebb0ccb43a0a487ab5df5556c8ee7eeff7f14821 Mon Sep 17 00:00:00 2001 From: 404Setup <153366651+404Setup@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:23:29 +0000 Subject: [PATCH] Optimize Vec capacity in DeflateEncoder output_buffers Pre-allocate `compressors` and `output_buffers` in `src/stream.rs` to reduce dynamic memory allocations during streaming compression. Use `reserve` for outer vectors and `with_capacity` for inner buffers. --- src/stream.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/stream.rs b/src/stream.rs index 36c8fce..282e5de 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -50,11 +50,20 @@ impl DeflateEncoder { let chunks: Vec<&[u8]> = self.buffer.chunks(chunk_size).collect(); let num_chunks = chunks.len(); - while self.compressors.len() < num_chunks { - self.compressors.push(Compressor::new(self.level)); + if self.compressors.len() < num_chunks { + self.compressors.reserve(num_chunks - self.compressors.len()); + while self.compressors.len() < num_chunks { + self.compressors.push(Compressor::new(self.level)); + } } - while self.output_buffers.len() < num_chunks { - self.output_buffers.push(Vec::new()); + + if self.output_buffers.len() < num_chunks { + self.output_buffers + .reserve(num_chunks - self.output_buffers.len()); + let bound = Compressor::deflate_compress_bound(chunk_size) + 5; + while self.output_buffers.len() < num_chunks { + self.output_buffers.push(Vec::with_capacity(bound)); + } } if num_chunks == 1 { @@ -135,7 +144,8 @@ impl DeflateEncoder { self.compressors.push(Compressor::new(self.level)); } if self.output_buffers.is_empty() { - self.output_buffers.push(Vec::new()); + let bound = Compressor::deflate_compress_bound(self.buffer.len()) + 5; + self.output_buffers.push(Vec::with_capacity(bound)); } let compressor = &mut self.compressors[0];