Skip to content

Commit c0cc06f

Browse files
authored
Pass slice instead of Vec during map serialization. (#284)
Before: utils::bench_serialize_map ... bench: 66.87 ns/iter (+/- 1.33) utils::bench_serialize_map_bytes ... bench: 69.42 ns/iter (+/- 1.45) After: utils::bench_serialize_map ... bench: 55.84 ns/iter (+/- 1.16) utils::bench_serialize_map_bytes ... bench: 56.03 ns/iter (+/- 1.19) Note that this is changed only in the private functions to avoid breaking the public API. Signed-off-by: Piotr Sikora <[email protected]>
1 parent 36e4ea2 commit c0cc06f

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

src/hostcalls.rs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ extern "C" {
190190
}
191191

192192
pub fn set_map(map_type: MapType, map: Vec<(&str, &str)>) -> Result<(), Status> {
193-
let serialized_map = utils::serialize_map(map);
193+
let serialized_map = utils::serialize_map(&map);
194194
unsafe {
195195
match proxy_set_header_map_pairs(map_type, serialized_map.as_ptr(), serialized_map.len()) {
196196
Status::Ok => Ok(()),
@@ -200,7 +200,7 @@ pub fn set_map(map_type: MapType, map: Vec<(&str, &str)>) -> Result<(), Status>
200200
}
201201

202202
pub fn set_map_bytes(map_type: MapType, map: Vec<(&str, &[u8])>) -> Result<(), Status> {
203-
let serialized_map = utils::serialize_map_bytes(map);
203+
let serialized_map = utils::serialize_map_bytes(&map);
204204
unsafe {
205205
match proxy_set_header_map_pairs(map_type, serialized_map.as_ptr(), serialized_map.len()) {
206206
Status::Ok => Ok(()),
@@ -719,7 +719,7 @@ pub fn send_http_response(
719719
headers: Vec<(&str, &str)>,
720720
body: Option<&[u8]>,
721721
) -> Result<(), Status> {
722-
let serialized_headers = utils::serialize_map(headers);
722+
let serialized_headers = utils::serialize_map(&headers);
723723
unsafe {
724724
match proxy_send_local_response(
725725
status_code,
@@ -742,7 +742,7 @@ pub fn send_grpc_response(
742742
grpc_status_message: Option<&str>,
743743
custom_metadata: Vec<(&str, &[u8])>,
744744
) -> Result<(), Status> {
745-
let serialized_custom_metadata = utils::serialize_map_bytes(custom_metadata);
745+
let serialized_custom_metadata = utils::serialize_map_bytes(&custom_metadata);
746746
unsafe {
747747
match proxy_send_local_response(
748748
200,
@@ -782,8 +782,8 @@ pub fn dispatch_http_call(
782782
trailers: Vec<(&str, &str)>,
783783
timeout: Duration,
784784
) -> Result<u32, Status> {
785-
let serialized_headers = utils::serialize_map(headers);
786-
let serialized_trailers = utils::serialize_map(trailers);
785+
let serialized_headers = utils::serialize_map(&headers);
786+
let serialized_trailers = utils::serialize_map(&trailers);
787787
let mut return_token: u32 = 0;
788788
unsafe {
789789
match proxy_http_call(
@@ -835,7 +835,7 @@ pub fn dispatch_grpc_call(
835835
timeout: Duration,
836836
) -> Result<u32, Status> {
837837
let mut return_callout_id = 0;
838-
let serialized_initial_metadata = utils::serialize_map_bytes(initial_metadata);
838+
let serialized_initial_metadata = utils::serialize_map_bytes(&initial_metadata);
839839
unsafe {
840840
match proxy_grpc_call(
841841
upstream_name.as_ptr(),
@@ -883,7 +883,7 @@ pub fn open_grpc_stream(
883883
initial_metadata: Vec<(&str, &[u8])>,
884884
) -> Result<u32, Status> {
885885
let mut return_stream_id = 0;
886-
let serialized_initial_metadata = utils::serialize_map_bytes(initial_metadata);
886+
let serialized_initial_metadata = utils::serialize_map_bytes(&initial_metadata);
887887
unsafe {
888888
match proxy_grpc_stream(
889889
upstream_name.as_ptr(),
@@ -1168,18 +1168,18 @@ mod utils {
11681168
bytes
11691169
}
11701170

1171-
pub(super) fn serialize_map(map: Vec<(&str, &str)>) -> Bytes {
1171+
pub(super) fn serialize_map(map: &[(&str, &str)]) -> Bytes {
11721172
let mut size: usize = 4;
1173-
for (name, value) in &map {
1173+
for (name, value) in map {
11741174
size += name.len() + value.len() + 10;
11751175
}
11761176
let mut bytes: Bytes = Vec::with_capacity(size);
11771177
bytes.extend_from_slice(&(map.len() as u32).to_le_bytes());
1178-
for (name, value) in &map {
1178+
for (name, value) in map {
11791179
bytes.extend_from_slice(&(name.len() as u32).to_le_bytes());
11801180
bytes.extend_from_slice(&(value.len() as u32).to_le_bytes());
11811181
}
1182-
for (name, value) in &map {
1182+
for (name, value) in map {
11831183
bytes.extend_from_slice(name.as_bytes());
11841184
bytes.push(0);
11851185
bytes.extend_from_slice(value.as_bytes());
@@ -1188,18 +1188,18 @@ mod utils {
11881188
bytes
11891189
}
11901190

1191-
pub(super) fn serialize_map_bytes(map: Vec<(&str, &[u8])>) -> Bytes {
1191+
pub(super) fn serialize_map_bytes(map: &[(&str, &[u8])]) -> Bytes {
11921192
let mut size: usize = 4;
1193-
for (name, value) in &map {
1193+
for (name, value) in map {
11941194
size += name.len() + value.len() + 10;
11951195
}
11961196
let mut bytes: Bytes = Vec::with_capacity(size);
11971197
bytes.extend_from_slice(&(map.len() as u32).to_le_bytes());
1198-
for (name, value) in &map {
1198+
for (name, value) in map {
11991199
bytes.extend_from_slice(&(name.len() as u32).to_le_bytes());
12001200
bytes.extend_from_slice(&(value.len() as u32).to_le_bytes());
12011201
}
1202-
for (name, value) in &map {
1202+
for (name, value) in map {
12031203
bytes.extend_from_slice(name.as_bytes());
12041204
bytes.push(0);
12051205
bytes.extend_from_slice(value);
@@ -1299,13 +1299,13 @@ mod utils {
12991299

13001300
#[test]
13011301
fn test_serialize_map_empty() {
1302-
let serialized_map = serialize_map(vec![]);
1302+
let serialized_map = serialize_map(&[]);
13031303
assert_eq!(serialized_map, [0, 0, 0, 0]);
13041304
}
13051305

13061306
#[test]
13071307
fn test_serialize_map_empty_bytes() {
1308-
let serialized_map = serialize_map_bytes(vec![]);
1308+
let serialized_map = serialize_map_bytes(&[]);
13091309
assert_eq!(serialized_map, [0, 0, 0, 0]);
13101310
}
13111311

@@ -1327,14 +1327,14 @@ mod utils {
13271327

13281328
#[test]
13291329
fn test_serialize_map() {
1330-
let serialized_map = serialize_map(MAP.to_vec());
1330+
let serialized_map = serialize_map(MAP);
13311331
assert_eq!(serialized_map, SERIALIZED_MAP);
13321332
}
13331333

13341334
#[test]
13351335
fn test_serialize_map_bytes() {
13361336
let map: Vec<(&str, &[u8])> = MAP.iter().map(|x| (x.0, x.1.as_bytes())).collect();
1337-
let serialized_map = serialize_map_bytes(map);
1337+
let serialized_map = serialize_map_bytes(&map);
13381338
assert_eq!(serialized_map, SERIALIZED_MAP);
13391339
}
13401340

@@ -1364,7 +1364,7 @@ mod utils {
13641364
// TODO(v0.3): fix arguments, so that maps can be reused without conversion.
13651365
let map_refs: Vec<(&str, &str)> =
13661366
map.iter().map(|x| (x.0.as_ref(), x.1.as_ref())).collect();
1367-
let serialized_map = serialize_map(map_refs);
1367+
let serialized_map = serialize_map(&map_refs);
13681368
assert_eq!(serialized_map, SERIALIZED_MAP);
13691369
}
13701370

@@ -1374,7 +1374,7 @@ mod utils {
13741374
// TODO(v0.3): fix arguments, so that maps can be reused without conversion.
13751375
let map_refs: Vec<(&str, &[u8])> =
13761376
map.iter().map(|x| (x.0.as_ref(), x.1.as_ref())).collect();
1377-
let serialized_map = serialize_map_bytes(map_refs);
1377+
let serialized_map = serialize_map_bytes(&map_refs);
13781378
assert_eq!(serialized_map, SERIALIZED_MAP);
13791379
}
13801380

@@ -1387,7 +1387,7 @@ mod utils {
13871387
// TODO(v0.3): fix arguments, so that maps can be reused without conversion.
13881388
let map_refs: Vec<(&str, &str)> =
13891389
map.iter().map(|x| (x.0.as_ref(), x.1.as_ref())).collect();
1390-
let serialized_map = serialize_map(map_refs);
1390+
let serialized_map = serialize_map(&map_refs);
13911391
assert_eq!(serialized_map, serialized_src);
13921392
}
13931393
// 0x80-0xff are invalid single-byte UTF-8 characters.
@@ -1410,7 +1410,7 @@ mod utils {
14101410
// TODO(v0.3): fix arguments, so that maps can be reused without conversion.
14111411
let map_refs: Vec<(&str, &[u8])> =
14121412
map.iter().map(|x| (x.0.as_ref(), x.1.as_ref())).collect();
1413-
let serialized_map = serialize_map_bytes(map_refs);
1413+
let serialized_map = serialize_map_bytes(&map_refs);
14141414
assert_eq!(serialized_map, serialized_src);
14151415
}
14161416
}
@@ -1420,7 +1420,7 @@ mod utils {
14201420
fn bench_serialize_map(b: &mut Bencher) {
14211421
let map = MAP.to_vec();
14221422
b.iter(|| {
1423-
serialize_map(test::black_box(map.clone()));
1423+
serialize_map(test::black_box(&map));
14241424
});
14251425
}
14261426

@@ -1429,7 +1429,7 @@ mod utils {
14291429
fn bench_serialize_map_bytes(b: &mut Bencher) {
14301430
let map: Vec<(&str, &[u8])> = MAP.iter().map(|x| (x.0, x.1.as_bytes())).collect();
14311431
b.iter(|| {
1432-
serialize_map_bytes(test::black_box(map.clone()));
1432+
serialize_map_bytes(test::black_box(&map));
14331433
});
14341434
}
14351435

0 commit comments

Comments
 (0)