1 // `cargo test --benches` and `#[feature(test)]` work only in nightly
2 #![cfg(rustc_nightly)]
3 #![feature(test)]
4 
5 extern crate protobuf;
6 extern crate test;
7 
8 use protobuf::CodedOutputStream;
9 
10 use self::test::Bencher;
11 
12 #[inline]
buffer_write_byte(os: &mut CodedOutputStream)13 fn buffer_write_byte(os: &mut CodedOutputStream) {
14     for i in 0..10 {
15         os.write_raw_byte(test::black_box(i as u8)).unwrap();
16     }
17     os.flush().unwrap();
18 }
19 
20 #[inline]
buffer_write_bytes(os: &mut CodedOutputStream)21 fn buffer_write_bytes(os: &mut CodedOutputStream) {
22     for _ in 0..10 {
23         os.write_raw_bytes(test::black_box(b"1234567890")).unwrap();
24     }
25     os.flush().unwrap();
26 }
27 
28 #[bench]
bench_buffer(b: &mut Bencher)29 fn bench_buffer(b: &mut Bencher) {
30     b.iter(|| {
31         let mut v = Vec::new();
32         {
33             let mut os = CodedOutputStream::new(&mut v);
34             buffer_write_byte(&mut os);
35         }
36         v
37     });
38 }
39 
40 #[bench]
bench_buffer_bytes(b: &mut Bencher)41 fn bench_buffer_bytes(b: &mut Bencher) {
42     b.iter(|| {
43         let mut v = Vec::new();
44         {
45             let mut os = CodedOutputStream::new(&mut v);
46             buffer_write_bytes(&mut os);
47         }
48         v
49     });
50 }
51 
52 #[bench]
bench_write_raw_varint_32(b: &mut Bencher)53 fn bench_write_raw_varint_32(b: &mut Bencher) {
54     let mut v = Vec::with_capacity(10_000);
55     b.iter(|| {
56         v.clear();
57         {
58             let mut os = CodedOutputStream::new(&mut v);
59             for i in 0..1000 {
60                 os.write_raw_varint32(i * 139 % 1000).unwrap();
61             }
62         }
63         v.len()
64     })
65 }
66