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