From 3471118004e9d01ecf7739e64e42fe5f2c54fc3d Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 23 Feb 2017 12:31:59 -0800 Subject: [PATCH] Smarter deserialize_bytes and deserialize_byte_buf (#115) * Smarter deserialize_bytes * Make read_vec faster by pre-allocating the correct amount of space. Also, call visit_bytes in deserialize_bytes rather than visit_byte_buf. --- src/serde/reader.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/serde/reader.rs b/src/serde/reader.rs index cc7c0a5..29d2db7 100644 --- a/src/serde/reader.rs +++ b/src/serde/reader.rs @@ -51,14 +51,19 @@ impl Deserializer { self.read_bytes(size_of::() as u64) } - fn read_string(&mut self) -> Result { + fn read_vec(&mut self) -> Result> { let len = try!(serde::Deserialize::deserialize(&mut *self)); try!(self.read_bytes(len)); - let mut buffer = Vec::new(); - try!(self.reader.by_ref().take(len as u64).read_to_end(&mut buffer)); + let len = len as usize; + let mut bytes = Vec::with_capacity(len); + unsafe { bytes.set_len(len); } + try!(self.reader.read_exact(&mut bytes)); + Ok(bytes) + } - String::from_utf8(buffer).map_err(|err| + fn read_string(&mut self) -> Result { + String::from_utf8(try!(self.read_vec())).map_err(|err| ErrorKind::InvalidEncoding{ desc: "error while decoding utf8 string", detail: Some(format!("Deserialize error: {}", err)) @@ -192,13 +197,13 @@ impl<'a, R: Read> serde::Deserializer for &'a mut Deserializer { fn deserialize_bytes(self, visitor: V) -> Result where V: serde::de::Visitor, { - self.deserialize_seq(visitor) + visitor.visit_bytes(&try!(self.read_vec())) } fn deserialize_byte_buf(self, visitor: V) -> Result where V: serde::de::Visitor, { - self.deserialize_seq(visitor) + visitor.visit_byte_buf(try!(self.read_vec())) } fn deserialize_enum(self,