From 4463d03ecbe98b00eb8000b399a13d36e26dfa85 Mon Sep 17 00:00:00 2001 From: jiacai2050 Date: Thu, 29 Aug 2024 15:03:51 +0800 Subject: [PATCH] fix: use iter to avoid reallocate --- rust/fury-core/src/resolver/meta_resolver.rs | 2 +- rust/fury-core/src/serializer/list.rs | 11 ++++------- rust/fury-core/src/serializer/map.rs | 17 +++++++---------- rust/fury-core/src/serializer/mod.rs | 4 ++-- rust/fury-core/src/serializer/set.rs | 9 +++------ 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/rust/fury-core/src/resolver/meta_resolver.rs b/rust/fury-core/src/resolver/meta_resolver.rs index b9a442c54e..1e177423d8 100644 --- a/rust/fury-core/src/resolver/meta_resolver.rs +++ b/rust/fury-core/src/resolver/meta_resolver.rs @@ -69,7 +69,7 @@ impl<'a> MetaWriterResolver<'a> { pub fn to_bytes(&self, writer: &mut Writer) -> Result<(), Error> { writer.var_int32(self.type_defs.len() as i32); - for item in self.type_defs.iter() { + for item in &self.type_defs { writer.bytes(item) } Ok(()) diff --git a/rust/fury-core/src/serializer/list.rs b/rust/fury-core/src/serializer/list.rs index 0b147f4379..46e76ff013 100644 --- a/rust/fury-core/src/serializer/list.rs +++ b/rust/fury-core/src/serializer/list.rs @@ -38,14 +38,11 @@ where } fn read(context: &mut ReadContext) -> Result { - // length + // vec length let len = context.reader.var_int32(); - // value - let mut result = Vec::new(); - for _ in 0..len { - result.push(T::deserialize(context)?); - } - Ok(result) + (0..len) + .map(|_| T::deserialize(context)) + .collect::, Error>>() } fn reserved_space() -> usize { diff --git a/rust/fury-core/src/serializer/map.rs b/rust/fury-core/src/serializer/map.rs index e79740f403..837e3ab61b 100644 --- a/rust/fury-core/src/serializer/map.rs +++ b/rust/fury-core/src/serializer/map.rs @@ -42,17 +42,14 @@ impl Serializer for HashM } fn read(context: &mut ReadContext) -> Result { - // length + // map length let len = context.reader.var_int32(); - let mut result = HashMap::new(); - // key-value - for _ in 0..len { - result.insert( - ::deserialize(context)?, - ::deserialize(context)?, - ); - } - Ok(result) + (0..len) + .map(|_| { + ::deserialize(context) + .and_then(|k| ::deserialize(context).map(|v| (k, v))) + }) + .collect::, Error>>() } fn reserved_space() -> usize { diff --git a/rust/fury-core/src/serializer/mod.rs b/rust/fury-core/src/serializer/mod.rs index 1803bdfb54..20f02093c5 100644 --- a/rust/fury-core/src/serializer/mod.rs +++ b/rust/fury-core/src/serializer/mod.rs @@ -67,8 +67,8 @@ pub trait Serializer where Self: Sized, { - /// The fixed memory size of the Type. - /// Avoid the memory check, which would hurt performance. + /// The possible max memory size of the type. + /// Used to reserve the buffer space to avoid reallocation, which may hurt performance. fn reserved_space() -> usize; /// Write the data into the buffer. diff --git a/rust/fury-core/src/serializer/set.rs b/rust/fury-core/src/serializer/set.rs index 4b8b84dba4..fd4eb51415 100644 --- a/rust/fury-core/src/serializer/set.rs +++ b/rust/fury-core/src/serializer/set.rs @@ -42,12 +42,9 @@ impl Serializer for HashSet { fn read(context: &mut ReadContext) -> Result { // length let len = context.reader.var_int32(); - let mut result = HashSet::new(); - // key-value - for _ in 0..len { - result.insert(::deserialize(context)?); - } - Ok(result) + (0..len) + .map(|_| T::deserialize(context)) + .collect::, Error>>() } fn reserved_space() -> usize {