From c88e9702d5da3e3f22ff1154bf3a2b8ad3a15974 Mon Sep 17 00:00:00 2001 From: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> Date: Sun, 7 Dec 2025 20:43:57 +1100 Subject: [PATCH 1/2] Optimize GzipDecoder - no heap allocation for footer which has fixed 8-byte size - do not store unused header - reset CrC instead of reassigning a new one - optimize check_crc: rm unnecessary size check Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> --- crates/compression-codecs/src/gzip/decoder.rs | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/crates/compression-codecs/src/gzip/decoder.rs b/crates/compression-codecs/src/gzip/decoder.rs index 5a72b049..ac241f86 100644 --- a/crates/compression-codecs/src/gzip/decoder.rs +++ b/crates/compression-codecs/src/gzip/decoder.rs @@ -1,4 +1,4 @@ -use super::header::{self, Header}; +use super::header; use crate::{DecodeV2, FlateDecoder}; use compression_core::util::{PartialBuffer, WriteBuffer}; use flate2::Crc; @@ -8,7 +8,7 @@ use std::io::{Error, ErrorKind, Result}; enum State { Header(header::Parser), Decoding, - Footer(PartialBuffer>), + Footer(PartialBuffer<[u8; 8]>), Done, } @@ -17,17 +17,9 @@ pub struct GzipDecoder { inner: FlateDecoder, crc: Crc, state: State, - header: Header, } -fn check_footer(crc: &Crc, input: &[u8]) -> Result<()> { - if input.len() < 8 { - return Err(Error::new( - ErrorKind::InvalidData, - "Invalid gzip footer length", - )); - } - +fn check_footer(crc: &Crc, input: &[u8; 8]) -> Result<()> { let crc_sum = crc.sum().to_le_bytes(); let bytes_read = crc.amount().to_le_bytes(); @@ -54,7 +46,6 @@ impl Default for GzipDecoder { inner: FlateDecoder::new(false), crc: Crc::new(), state: State::Header(header::Parser::default()), - header: Header::default(), } } } @@ -73,8 +64,7 @@ impl GzipDecoder { loop { match &mut self.state { State::Header(parser) => { - if let Some(header) = parser.input(input)? { - self.header = header; + if parser.input(input)?.is_some() { self.state = State::Decoding; } } @@ -92,7 +82,7 @@ impl GzipDecoder { let done = res?; if done { - self.state = State::Footer(vec![0; 8].into()) + self.state = State::Footer([0; 8]); } } @@ -100,8 +90,8 @@ impl GzipDecoder { footer.copy_unwritten_from(input); if footer.unwritten().is_empty() { - check_footer(&self.crc, footer.written())?; - self.state = State::Done + check_footer(&self.crc, footer.get_mut())?; + self.state = State::Done; } } @@ -122,9 +112,8 @@ impl GzipDecoder { impl DecodeV2 for GzipDecoder { fn reinit(&mut self) -> Result<()> { self.inner.reinit()?; - self.crc = Crc::new(); + self.crc.reset(); self.state = State::Header(header::Parser::default()); - self.header = Header::default(); Ok(()) } From fc90c6b8ed0644a0d200d3bfa15bd374a1007292 Mon Sep 17 00:00:00 2001 From: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> Date: Sun, 7 Dec 2025 20:49:47 +1100 Subject: [PATCH 2/2] Fix GzipDecoder Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> --- crates/compression-codecs/src/gzip/decoder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/compression-codecs/src/gzip/decoder.rs b/crates/compression-codecs/src/gzip/decoder.rs index ac241f86..647959cf 100644 --- a/crates/compression-codecs/src/gzip/decoder.rs +++ b/crates/compression-codecs/src/gzip/decoder.rs @@ -82,7 +82,7 @@ impl GzipDecoder { let done = res?; if done { - self.state = State::Footer([0; 8]); + self.state = State::Footer([0; 8].into()); } }