Skip to content

Commit 7ce16e4

Browse files
authored
Optimize Vec capacity in DeflateEncoder output_buffers (#420)
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.
1 parent 196744c commit 7ce16e4

1 file changed

Lines changed: 15 additions & 5 deletions

File tree

src/stream.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,20 @@ impl<W: Write + Send> DeflateEncoder<W> {
5050
let chunks: Vec<&[u8]> = self.buffer.chunks(chunk_size).collect();
5151
let num_chunks = chunks.len();
5252

53-
while self.compressors.len() < num_chunks {
54-
self.compressors.push(Compressor::new(self.level));
53+
if self.compressors.len() < num_chunks {
54+
self.compressors.reserve(num_chunks - self.compressors.len());
55+
while self.compressors.len() < num_chunks {
56+
self.compressors.push(Compressor::new(self.level));
57+
}
5558
}
56-
while self.output_buffers.len() < num_chunks {
57-
self.output_buffers.push(Vec::new());
59+
60+
if self.output_buffers.len() < num_chunks {
61+
self.output_buffers
62+
.reserve(num_chunks - self.output_buffers.len());
63+
let bound = Compressor::deflate_compress_bound(chunk_size) + 5;
64+
while self.output_buffers.len() < num_chunks {
65+
self.output_buffers.push(Vec::with_capacity(bound));
66+
}
5867
}
5968

6069
if num_chunks == 1 {
@@ -135,7 +144,8 @@ impl<W: Write + Send> DeflateEncoder<W> {
135144
self.compressors.push(Compressor::new(self.level));
136145
}
137146
if self.output_buffers.is_empty() {
138-
self.output_buffers.push(Vec::new());
147+
let bound = Compressor::deflate_compress_bound(self.buffer.len()) + 5;
148+
self.output_buffers.push(Vec::with_capacity(bound));
139149
}
140150

141151
let compressor = &mut self.compressors[0];

0 commit comments

Comments
 (0)