Skip to content

Commit 8cfe415

Browse files
authored
perf(compress): remove Vec allocation in calculate_dynamic_header_size (#418)
1 parent 57825c7 commit 8cfe415

4 files changed

Lines changed: 2444 additions & 6 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

patch.diff

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
--- src/compress/mod.rs
2+
+++ src/compress/mod.rs
3+
@@ -1144,14 +1144,15 @@
4+
num_offset_syms -= 1;
5+
}
6+
7+
- let mut lens = Vec::with_capacity(num_litlen_syms + num_offset_syms);
8+
- lens.extend_from_slice(&self.litlen_lens[..num_litlen_syms]);
9+
- lens.extend_from_slice(&self.offset_lens[..num_offset_syms]);
10+
+ let mut lens = [0u8; DEFLATE_NUM_LITLEN_SYMS + DEFLATE_NUM_OFFSET_SYMS];
11+
+ let lens_len = num_litlen_syms + num_offset_syms;
12+
+ lens[..num_litlen_syms].copy_from_slice(&self.litlen_lens[..num_litlen_syms]);
13+
+ lens[num_litlen_syms..lens_len].copy_from_slice(&self.offset_lens[..num_offset_syms]);
14+
15+
let mut precode_freqs = [0u32; 19];
16+
let mut i = 0;
17+
- while i < lens.len() {
18+
+ while i < lens_len {
19+
let len = lens[i];
20+
let mut run = 1;
21+
- while i + run < lens.len() && lens[i + run] == len {
22+
+ while i + run < lens_len && lens[i + run] == len {
23+
run += 1;
24+
}
25+
@@ -1172,7 +1173,7 @@
26+
precode_freqs[len as usize] += 1;
27+
run -= 1;
28+
}
29+
- i += lens[i..].iter().take_while(|&&l| l == len).count();
30+
+ i += lens[i..lens_len].iter().take_while(|&&l| l == len).count();
31+
}
32+
33+
let mut precode_lens = [0u8; 19];

src/compress/mod.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,16 +1144,17 @@ impl Compressor {
11441144
num_offset_syms -= 1;
11451145
}
11461146

1147-
let mut lens = Vec::with_capacity(num_litlen_syms + num_offset_syms);
1148-
lens.extend_from_slice(&self.litlen_lens[..num_litlen_syms]);
1149-
lens.extend_from_slice(&self.offset_lens[..num_offset_syms]);
1147+
let mut lens = [0u8; DEFLATE_NUM_LITLEN_SYMS + DEFLATE_NUM_OFFSET_SYMS];
1148+
let lens_len = num_litlen_syms + num_offset_syms;
1149+
lens[..num_litlen_syms].copy_from_slice(&self.litlen_lens[..num_litlen_syms]);
1150+
lens[num_litlen_syms..lens_len].copy_from_slice(&self.offset_lens[..num_offset_syms]);
11501151

11511152
let mut precode_freqs = [0u32; 19];
11521153
let mut i = 0;
1153-
while i < lens.len() {
1154+
while i < lens_len {
11541155
let len = lens[i];
11551156
let mut run = 1;
1156-
while i + run < lens.len() && lens[i + run] == len {
1157+
while i + run < lens_len && lens[i + run] == len {
11571158
run += 1;
11581159
}
11591160
if len == 0 {

0 commit comments

Comments
 (0)