Skip to content

Commit 7bf1b99

Browse files
authored
Optimize gzip::header remove heap allocation (#428)
* Optimize gzip::header avoid heap allocation Part of #397 Signed-off-by: Jiahao XU <[email protected]> * Fix header Signed-off-by: Jiahao XU <[email protected]> * Fix typo Signed-off-by: Jiahao XU <[email protected]> * Fix bytes_to_consume usage Signed-off-by: Jiahao XU <[email protected]> --------- Signed-off-by: Jiahao XU <[email protected]>
1 parent 7cc3ec9 commit 7bf1b99

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

crates/compression-codecs/src/gzip/header.rs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ pub(super) struct Header {
1919
enum State {
2020
Fixed(PartialBuffer<[u8; 10]>),
2121
ExtraLen(PartialBuffer<[u8; 2]>),
22-
Extra(PartialBuffer<Vec<u8>>),
23-
Filename(Vec<u8>),
24-
Comment(Vec<u8>),
22+
Extra(usize),
23+
Filename,
24+
Comment,
2525
Crc(PartialBuffer<[u8; 2]>),
2626
Done,
2727
}
@@ -78,59 +78,57 @@ impl Parser {
7878

7979
State::ExtraLen(data) => {
8080
if !self.header.flags.extra {
81-
self.state = State::Filename(<_>::default());
81+
self.state = State::Filename;
8282
continue;
8383
}
8484

8585
data.copy_unwritten_from(input);
8686

8787
if data.unwritten().is_empty() {
8888
let len = u16::from_le_bytes(data.take().into_inner());
89-
self.state = State::Extra(vec![0; usize::from(len)].into());
89+
self.state = State::Extra(len.into());
9090
} else {
9191
return Ok(None);
9292
}
9393
}
9494

95-
State::Extra(data) => {
96-
data.copy_unwritten_from(input);
95+
State::Extra(bytes_to_consume) => {
96+
let n = input.unwritten().len().min(*bytes_to_consume);
97+
*bytes_to_consume -= n;
98+
input.advance(n);
9799

98-
if data.unwritten().is_empty() {
99-
self.state = State::Filename(<_>::default());
100+
if *bytes_to_consume == 0 {
101+
self.state = State::Filename;
100102
} else {
101103
return Ok(None);
102104
}
103105
}
104106

105-
State::Filename(data) => {
107+
State::Filename => {
106108
if !self.header.flags.filename {
107-
self.state = State::Comment(<_>::default());
109+
self.state = State::Comment;
108110
continue;
109111
}
110112

111113
if let Some(len) = memchr::memchr(0, input.unwritten()) {
112-
data.extend_from_slice(&input.unwritten()[..len]);
113114
input.advance(len + 1);
114-
self.state = State::Comment(<_>::default());
115+
self.state = State::Comment;
115116
} else {
116-
data.extend_from_slice(input.unwritten());
117117
input.advance(input.unwritten().len());
118118
return Ok(None);
119119
}
120120
}
121121

122-
State::Comment(data) => {
122+
State::Comment => {
123123
if !self.header.flags.comment {
124124
self.state = State::Crc(<_>::default());
125125
continue;
126126
}
127127

128128
if let Some(len) = memchr::memchr(0, input.unwritten()) {
129-
data.extend_from_slice(&input.unwritten()[..len]);
130129
input.advance(len + 1);
131130
self.state = State::Crc(<_>::default());
132131
} else {
133-
data.extend_from_slice(input.unwritten());
134132
input.advance(input.unwritten().len());
135133
return Ok(None);
136134
}

0 commit comments

Comments
 (0)