1 use self::rand::distributions::uniform::Uniform;
2 use self::rand::distributions::Distribution;
3 use self::rand::SeedableRng;
4 use self::test::Bencher;
5 use super::deserializer::{varint_read, varint_read_slice};
6 use super::v2_serializer::varint_write;
7 use std::io::Cursor;
8
9 #[bench]
varint_write_rand(b: &mut Bencher)10 fn varint_write_rand(b: &mut Bencher) {
11 do_varint_write_rand(b, Uniform::new(0, u64::max_value()))
12 }
13
14 #[bench]
varint_write_rand_1_byte(b: &mut Bencher)15 fn varint_write_rand_1_byte(b: &mut Bencher) {
16 do_varint_write_rand(b, Uniform::new(0, 128))
17 }
18
19 #[bench]
varint_write_rand_9_bytes(b: &mut Bencher)20 fn varint_write_rand_9_bytes(b: &mut Bencher) {
21 do_varint_write_rand(b, Uniform::new(1 << 56, u64::max_value()))
22 }
23
24 #[bench]
varint_read_rand(b: &mut Bencher)25 fn varint_read_rand(b: &mut Bencher) {
26 do_varint_read_rand(b, Uniform::new(0, u64::max_value()))
27 }
28
29 #[bench]
varint_read_rand_1_byte(b: &mut Bencher)30 fn varint_read_rand_1_byte(b: &mut Bencher) {
31 do_varint_read_rand(b, Uniform::new(0, 128))
32 }
33
34 #[bench]
varint_read_rand_9_byte(b: &mut Bencher)35 fn varint_read_rand_9_byte(b: &mut Bencher) {
36 do_varint_read_rand(b, Uniform::new(1 << 56, u64::max_value()))
37 }
38
39 #[bench]
varint_read_slice_rand(b: &mut Bencher)40 fn varint_read_slice_rand(b: &mut Bencher) {
41 do_varint_read_slice_rand(b, Uniform::new(0, u64::max_value()))
42 }
43
44 #[bench]
varint_read_slice_rand_1_byte(b: &mut Bencher)45 fn varint_read_slice_rand_1_byte(b: &mut Bencher) {
46 do_varint_read_slice_rand(b, Uniform::new(0, 128))
47 }
48
49 #[bench]
varint_read_slice_rand_9_byte(b: &mut Bencher)50 fn varint_read_slice_rand_9_byte(b: &mut Bencher) {
51 do_varint_read_slice_rand(b, Uniform::new(1 << 56, u64::max_value()))
52 }
53
do_varint_write_rand(b: &mut Bencher, range: Uniform<u64>)54 fn do_varint_write_rand(b: &mut Bencher, range: Uniform<u64>) {
55 let mut rng = rand::rngs::SmallRng::from_entropy();
56 let num = 1000_000;
57 let mut vec: Vec<u64> = Vec::new();
58
59 for _ in 0..num {
60 vec.push(range.sample(&mut rng));
61 }
62
63 let mut buf = [0; 9];
64 b.iter(|| {
65 for i in vec.iter() {
66 let _ = varint_write(*i, &mut buf);
67 }
68 });
69 }
70
do_varint_read_rand(b: &mut Bencher, range: Uniform<u64>)71 fn do_varint_read_rand(b: &mut Bencher, range: Uniform<u64>) {
72 let mut rng = rand::rngs::SmallRng::from_entropy();
73 let num = 1000_000;
74 let mut vec = Vec::new();
75 vec.resize(9 * num, 0);
76 let mut bytes_written = 0;
77
78 for _ in 0..num {
79 bytes_written += varint_write(range.sample(&mut rng), &mut vec[bytes_written..]);
80 }
81
82 b.iter(|| {
83 let mut cursor = Cursor::new(&vec);
84 for _ in 0..num {
85 let _ = varint_read(&mut cursor);
86 }
87 });
88 }
89
do_varint_read_slice_rand(b: &mut Bencher, range: Uniform<u64>)90 fn do_varint_read_slice_rand(b: &mut Bencher, range: Uniform<u64>) {
91 let mut rng = rand::rngs::SmallRng::from_entropy();
92 let num = 1000_000;
93 let mut vec = Vec::new();
94
95 vec.resize(9 * num, 0);
96 let mut bytes_written = 0;
97
98 for _ in 0..num {
99 bytes_written += varint_write(range.sample(&mut rng), &mut vec[bytes_written..]);
100 }
101
102 b.iter(|| {
103 let mut input_index = 0;
104 // cheat a little bit: this will skip the last couple numbers, but that's why we do a
105 // million numbers. Losing the last few won't be measurable.
106 while input_index < bytes_written - 9 {
107 let (_, bytes_read) = varint_read_slice(&vec[input_index..(input_index + 9)]);
108 input_index += bytes_read;
109 }
110 });
111 }
112