From 74557730c7fdd0b1a22737024c471f1ef5fc79a1 Mon Sep 17 00:00:00 2001 From: Piotr Sikora Date: Sun, 27 Oct 2024 19:11:28 -0400 Subject: [PATCH] Optimize Vec allocations in map deserialization. Before: utils::bench_deserialize_map ... bench: 171.39 ns/iter (+/- 3.53) utils::bench_deserialize_map_bytes ... bench: 148.27 ns/iter (+/- 3.19) After: utils::bench_deserialize_map ... bench: 168.34 ns/iter (+/- 3.19) utils::bench_deserialize_map_bytes ... bench: 145.40 ns/iter (+/- 1.92) Signed-off-by: Piotr Sikora --- src/hostcalls.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hostcalls.rs b/src/hostcalls.rs index 15687888..f8252c56 100644 --- a/src/hostcalls.rs +++ b/src/hostcalls.rs @@ -152,8 +152,8 @@ pub fn get_map(map_type: MapType) -> Result, Status> { match proxy_get_header_map_pairs(map_type, &mut return_data, &mut return_size) { Status::Ok => { if !return_data.is_null() { - let serialized_map = Vec::from_raw_parts(return_data, return_size, return_size); - Ok(utils::deserialize_map(&serialized_map)) + let serialized_map = std::slice::from_raw_parts(return_data, return_size); + Ok(utils::deserialize_map(serialized_map)) } else { Ok(Vec::new()) } @@ -170,8 +170,8 @@ pub fn get_map_bytes(map_type: MapType) -> Result, Status> match proxy_get_header_map_pairs(map_type, &mut return_data, &mut return_size) { Status::Ok => { if !return_data.is_null() { - let serialized_map = Vec::from_raw_parts(return_data, return_size, return_size); - Ok(utils::deserialize_map_bytes(&serialized_map)) + let serialized_map = std::slice::from_raw_parts(return_data, return_size); + Ok(utils::deserialize_map_bytes(serialized_map)) } else { Ok(Vec::new()) } @@ -1200,11 +1200,11 @@ mod utils { } pub(super) fn deserialize_map(bytes: &[u8]) -> Vec<(String, String)> { - let mut map = Vec::new(); if bytes.is_empty() { - return map; + return Vec::new(); } let size = u32::from_le_bytes(<[u8; 4]>::try_from(&bytes[0..4]).unwrap()) as usize; + let mut map = Vec::with_capacity(size); let mut p = 4 + size * 8; for n in 0..size { let s = 4 + n * 8; @@ -1224,11 +1224,11 @@ mod utils { } pub(super) fn deserialize_map_bytes(bytes: &[u8]) -> Vec<(String, Bytes)> { - let mut map = Vec::new(); if bytes.is_empty() { - return map; + return Vec::new(); } let size = u32::from_le_bytes(<[u8; 4]>::try_from(&bytes[0..4]).unwrap()) as usize; + let mut map = Vec::with_capacity(size); let mut p = 4 + size * 8; for n in 0..size { let s = 4 + n * 8;