Skip to content

Commit 764fcea

Browse files
authored
Optimize Vec allocations in map deserialization. (#285)
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 <[email protected]>
1 parent 6d88ed5 commit 764fcea

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

src/hostcalls.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ pub fn get_map(map_type: MapType) -> Result<Vec<(String, String)>, Status> {
152152
match proxy_get_header_map_pairs(map_type, &mut return_data, &mut return_size) {
153153
Status::Ok => {
154154
if !return_data.is_null() {
155-
let serialized_map = Vec::from_raw_parts(return_data, return_size, return_size);
156-
Ok(utils::deserialize_map(&serialized_map))
155+
let serialized_map = std::slice::from_raw_parts(return_data, return_size);
156+
Ok(utils::deserialize_map(serialized_map))
157157
} else {
158158
Ok(Vec::new())
159159
}
@@ -170,8 +170,8 @@ pub fn get_map_bytes(map_type: MapType) -> Result<Vec<(String, Bytes)>, Status>
170170
match proxy_get_header_map_pairs(map_type, &mut return_data, &mut return_size) {
171171
Status::Ok => {
172172
if !return_data.is_null() {
173-
let serialized_map = Vec::from_raw_parts(return_data, return_size, return_size);
174-
Ok(utils::deserialize_map_bytes(&serialized_map))
173+
let serialized_map = std::slice::from_raw_parts(return_data, return_size);
174+
Ok(utils::deserialize_map_bytes(serialized_map))
175175
} else {
176176
Ok(Vec::new())
177177
}
@@ -1200,11 +1200,11 @@ mod utils {
12001200
}
12011201

12021202
pub(super) fn deserialize_map(bytes: &[u8]) -> Vec<(String, String)> {
1203-
let mut map = Vec::new();
12041203
if bytes.is_empty() {
1205-
return map;
1204+
return Vec::new();
12061205
}
12071206
let size = u32::from_le_bytes(<[u8; 4]>::try_from(&bytes[0..4]).unwrap()) as usize;
1207+
let mut map = Vec::with_capacity(size);
12081208
let mut p = 4 + size * 8;
12091209
for n in 0..size {
12101210
let s = 4 + n * 8;
@@ -1224,11 +1224,11 @@ mod utils {
12241224
}
12251225

12261226
pub(super) fn deserialize_map_bytes(bytes: &[u8]) -> Vec<(String, Bytes)> {
1227-
let mut map = Vec::new();
12281227
if bytes.is_empty() {
1229-
return map;
1228+
return Vec::new();
12301229
}
12311230
let size = u32::from_le_bytes(<[u8; 4]>::try_from(&bytes[0..4]).unwrap()) as usize;
1231+
let mut map = Vec::with_capacity(size);
12321232
let mut p = 4 + size * 8;
12331233
for n in 0..size {
12341234
let s = 4 + n * 8;

0 commit comments

Comments
 (0)