-
Notifications
You must be signed in to change notification settings - Fork 1
/
bench_serialization.rs
100 lines (89 loc) · 2.69 KB
/
bench_serialization.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright 2017 TiKV Project Authors. Licensed under Apache-2.0.
use kvproto::raft_cmdpb::{CmdType, RaftCmdRequest, Request};
use raft::eraftpb::Entry;
use protobuf::{self, Message};
use rand::{thread_rng, Rng};
use test::Bencher;
use tikv_util::collections::HashMap;
#[inline]
fn gen_rand_str(len: usize) -> Vec<u8> {
let mut rand_str = vec![0; len];
thread_rng().fill_bytes(&mut rand_str);
rand_str
}
#[inline]
fn generate_requests(map: &HashMap<&[u8], &[u8]>) -> Vec<Request> {
let mut reqs = vec![];
for (key, value) in map {
let mut r = Request::new();
r.set_cmd_type(CmdType::Put);
r.mut_put().set_cf("tikv".to_owned());
r.mut_put().set_key(key.to_vec());
r.mut_put().set_value(value.to_vec());
reqs.push(r);
}
reqs
}
fn encode(map: &HashMap<&[u8], &[u8]>) -> Vec<u8> {
let mut e = Entry::new();
let mut cmd = RaftCmdRequest::new();
let reqs = generate_requests(map);
cmd.set_requests(protobuf::RepeatedField::from_vec(reqs));
let cmd_msg = cmd.write_to_bytes().unwrap();
e.set_data(cmd_msg);
e.write_to_bytes().unwrap()
}
fn decode(data: &[u8]) {
let mut entry = Entry::new();
entry.merge_from_bytes(data).unwrap();
let mut cmd = RaftCmdRequest::new();
cmd.merge_from_bytes(entry.get_data()).unwrap();
}
#[bench]
fn bench_encode_one(b: &mut Bencher) {
let key = gen_rand_str(30);
let value = gen_rand_str(256);
let mut map: HashMap<&[u8], &[u8]> = HashMap::default();
map.insert(&key, &value);
b.iter(|| {
encode(&map);
});
}
#[bench]
fn bench_decode_one(b: &mut Bencher) {
let key = gen_rand_str(30);
let value = gen_rand_str(256);
let mut map: HashMap<&[u8], &[u8]> = HashMap::default();
map.insert(&key, &value);
let data = encode(&map);
b.iter(|| {
decode(&data);
});
}
#[bench]
fn bench_encode_two(b: &mut Bencher) {
let key_for_lock = gen_rand_str(30);
let value_for_lock = gen_rand_str(10);
let key_for_data = gen_rand_str(30);
let value_for_data = gen_rand_str(256);
let mut map: HashMap<&[u8], &[u8]> = HashMap::default();
map.insert(&key_for_lock, &value_for_lock);
map.insert(&key_for_data, &value_for_data);
b.iter(|| {
encode(&map);
});
}
#[bench]
fn bench_decode_two(b: &mut Bencher) {
let key_for_lock = gen_rand_str(30);
let value_for_lock = gen_rand_str(10);
let key_for_data = gen_rand_str(30);
let value_for_data = gen_rand_str(256);
let mut map: HashMap<&[u8], &[u8]> = HashMap::default();
map.insert(&key_for_lock, &value_for_lock);
map.insert(&key_for_data, &value_for_data);
let data = encode(&map);
b.iter(|| {
decode(&data);
});
}