Skip to content

Commit a5ca5c8

Browse files
committed
Pass slice instead of Vec during map serialization.
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 7bad453 commit a5ca5c8

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

Diff for: src/hostcalls.rs

+20-20
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(()),
@@ -710,7 +710,7 @@ pub fn send_http_response(
710710
headers: Vec<(&str, &str)>,
711711
body: Option<&[u8]>,
712712
) -> Result<(), Status> {
713-
let serialized_headers = utils::serialize_map(headers);
713+
let serialized_headers = utils::serialize_map(&headers);
714714
unsafe {
715715
match proxy_send_local_response(
716716
status_code,
@@ -733,7 +733,7 @@ pub fn send_grpc_response(
733733
grpc_status_message: Option<&str>,
734734
custom_metadata: Vec<(&str, &[u8])>,
735735
) -> Result<(), Status> {
736-
let serialized_custom_metadata = utils::serialize_map_bytes(custom_metadata);
736+
let serialized_custom_metadata = utils::serialize_map_bytes(&custom_metadata);
737737
unsafe {
738738
match proxy_send_local_response(
739739
200,
@@ -773,8 +773,8 @@ pub fn dispatch_http_call(
773773
trailers: Vec<(&str, &str)>,
774774
timeout: Duration,
775775
) -> Result<u32, Status> {
776-
let serialized_headers = utils::serialize_map(headers);
777-
let serialized_trailers = utils::serialize_map(trailers);
776+
let serialized_headers = utils::serialize_map(&headers);
777+
let serialized_trailers = utils::serialize_map(&trailers);
778778
let mut return_token: u32 = 0;
779779
unsafe {
780780
match proxy_http_call(
@@ -826,7 +826,7 @@ pub fn dispatch_grpc_call(
826826
timeout: Duration,
827827
) -> Result<u32, Status> {
828828
let mut return_callout_id = 0;
829-
let serialized_initial_metadata = utils::serialize_map_bytes(initial_metadata);
829+
let serialized_initial_metadata = utils::serialize_map_bytes(&initial_metadata);
830830
unsafe {
831831
match proxy_grpc_call(
832832
upstream_name.as_ptr(),
@@ -874,7 +874,7 @@ pub fn open_grpc_stream(
874874
initial_metadata: Vec<(&str, &[u8])>,
875875
) -> Result<u32, Status> {
876876
let mut return_stream_id = 0;
877-
let serialized_initial_metadata = utils::serialize_map_bytes(initial_metadata);
877+
let serialized_initial_metadata = utils::serialize_map_bytes(&initial_metadata);
878878
unsafe {
879879
match proxy_grpc_stream(
880880
upstream_name.as_ptr(),
@@ -1159,18 +1159,18 @@ mod utils {
11591159
bytes
11601160
}
11611161

1162-
pub(super) fn serialize_map(map: Vec<(&str, &str)>) -> Bytes {
1162+
pub(super) fn serialize_map(map: &[(&str, &str)]) -> Bytes {
11631163
let mut size: usize = 4;
1164-
for (name, value) in &map {
1164+
for (name, value) in map {
11651165
size += name.len() + value.len() + 10;
11661166
}
11671167
let mut bytes: Bytes = Vec::with_capacity(size);
11681168
bytes.extend_from_slice(&(map.len() as u32).to_le_bytes());
1169-
for (name, value) in &map {
1169+
for (name, value) in map {
11701170
bytes.extend_from_slice(&(name.len() as u32).to_le_bytes());
11711171
bytes.extend_from_slice(&(value.len() as u32).to_le_bytes());
11721172
}
1173-
for (name, value) in &map {
1173+
for (name, value) in map {
11741174
bytes.extend_from_slice(name.as_bytes());
11751175
bytes.push(0);
11761176
bytes.extend_from_slice(value.as_bytes());
@@ -1179,18 +1179,18 @@ mod utils {
11791179
bytes
11801180
}
11811181

1182-
pub(super) fn serialize_map_bytes(map: Vec<(&str, &[u8])>) -> Bytes {
1182+
pub(super) fn serialize_map_bytes(map: &[(&str, &[u8])]) -> Bytes {
11831183
let mut size: usize = 4;
1184-
for (name, value) in &map {
1184+
for (name, value) in map {
11851185
size += name.len() + value.len() + 10;
11861186
}
11871187
let mut bytes: Bytes = Vec::with_capacity(size);
11881188
bytes.extend_from_slice(&(map.len() as u32).to_le_bytes());
1189-
for (name, value) in &map {
1189+
for (name, value) in map {
11901190
bytes.extend_from_slice(&(name.len() as u32).to_le_bytes());
11911191
bytes.extend_from_slice(&(value.len() as u32).to_le_bytes());
11921192
}
1193-
for (name, value) in &map {
1193+
for (name, value) in map {
11941194
bytes.extend_from_slice(name.as_bytes());
11951195
bytes.push(0);
11961196
bytes.extend_from_slice(value);
@@ -1290,14 +1290,14 @@ mod utils {
12901290

12911291
#[test]
12921292
fn test_serialize_map() {
1293-
let serialized_map = serialize_map(MAP.to_vec());
1293+
let serialized_map = serialize_map(MAP);
12941294
assert_eq!(serialized_map, SERIALIZED_MAP);
12951295
}
12961296

12971297
#[test]
12981298
fn test_serialize_map_bytes() {
12991299
let map: Vec<(&str, &[u8])> = MAP.iter().map(|x| (x.0, x.1.as_bytes())).collect();
1300-
let serialized_map = serialize_map_bytes(map);
1300+
let serialized_map = serialize_map_bytes(&map);
13011301
assert_eq!(serialized_map, SERIALIZED_MAP);
13021302
}
13031303

@@ -1326,7 +1326,7 @@ mod utils {
13261326
fn bench_serialize_map(b: &mut Bencher) {
13271327
let map = MAP.to_vec();
13281328
b.iter(|| {
1329-
serialize_map(test::black_box(map.clone()));
1329+
serialize_map(test::black_box(&map));
13301330
});
13311331
}
13321332

@@ -1335,7 +1335,7 @@ mod utils {
13351335
fn bench_serialize_map_bytes(b: &mut Bencher) {
13361336
let map: Vec<(&str, &[u8])> = MAP.iter().map(|x| (x.0, x.1.as_bytes())).collect();
13371337
b.iter(|| {
1338-
serialize_map_bytes(test::black_box(map.clone()));
1338+
serialize_map_bytes(test::black_box(&map));
13391339
});
13401340
}
13411341

0 commit comments

Comments
 (0)