| #![feature(test)] |
| #![warn(rust_2018_idioms)] |
| |
| extern crate test; |
| |
| use bytes::{BufMut, BytesMut}; |
| use test::Bencher; |
| |
| #[bench] |
| fn alloc_small(b: &mut Bencher) { |
| b.iter(|| { |
| for _ in 0..1024 { |
| test::black_box(BytesMut::with_capacity(12)); |
| } |
| }) |
| } |
| |
| #[bench] |
| fn alloc_mid(b: &mut Bencher) { |
| b.iter(|| { |
| test::black_box(BytesMut::with_capacity(128)); |
| }) |
| } |
| |
| #[bench] |
| fn alloc_big(b: &mut Bencher) { |
| b.iter(|| { |
| test::black_box(BytesMut::with_capacity(4096)); |
| }) |
| } |
| |
| #[bench] |
| fn deref_unique(b: &mut Bencher) { |
| let mut buf = BytesMut::with_capacity(4096); |
| buf.put(&[0u8; 1024][..]); |
| |
| b.iter(|| { |
| for _ in 0..1024 { |
| test::black_box(&buf[..]); |
| } |
| }) |
| } |
| |
| #[bench] |
| fn deref_unique_unroll(b: &mut Bencher) { |
| let mut buf = BytesMut::with_capacity(4096); |
| buf.put(&[0u8; 1024][..]); |
| |
| b.iter(|| { |
| for _ in 0..128 { |
| test::black_box(&buf[..]); |
| test::black_box(&buf[..]); |
| test::black_box(&buf[..]); |
| test::black_box(&buf[..]); |
| test::black_box(&buf[..]); |
| test::black_box(&buf[..]); |
| test::black_box(&buf[..]); |
| test::black_box(&buf[..]); |
| } |
| }) |
| } |
| |
| #[bench] |
| fn deref_shared(b: &mut Bencher) { |
| let mut buf = BytesMut::with_capacity(4096); |
| buf.put(&[0u8; 1024][..]); |
| let _b2 = buf.split_off(1024); |
| |
| b.iter(|| { |
| for _ in 0..1024 { |
| test::black_box(&buf[..]); |
| } |
| }) |
| } |
| |
| #[bench] |
| fn deref_two(b: &mut Bencher) { |
| let mut buf1 = BytesMut::with_capacity(8); |
| buf1.put(&[0u8; 8][..]); |
| |
| let mut buf2 = BytesMut::with_capacity(4096); |
| buf2.put(&[0u8; 1024][..]); |
| |
| b.iter(|| { |
| for _ in 0..512 { |
| test::black_box(&buf1[..]); |
| test::black_box(&buf2[..]); |
| } |
| }) |
| } |
| |
| #[bench] |
| fn clone_frozen(b: &mut Bencher) { |
| let bytes = BytesMut::from(&b"hello world 1234567890 and have a good byte 0987654321"[..]) |
| .split() |
| .freeze(); |
| |
| b.iter(|| { |
| for _ in 0..1024 { |
| test::black_box(&bytes.clone()); |
| } |
| }) |
| } |
| |
| #[bench] |
| fn alloc_write_split_to_mid(b: &mut Bencher) { |
| b.iter(|| { |
| let mut buf = BytesMut::with_capacity(128); |
| buf.put_slice(&[0u8; 64]); |
| test::black_box(buf.split_to(64)); |
| }) |
| } |
| |
| #[bench] |
| fn drain_write_drain(b: &mut Bencher) { |
| let data = [0u8; 128]; |
| |
| b.iter(|| { |
| let mut buf = BytesMut::with_capacity(1024); |
| let mut parts = Vec::with_capacity(8); |
| |
| for _ in 0..8 { |
| buf.put(&data[..]); |
| parts.push(buf.split_to(128)); |
| } |
| |
| test::black_box(parts); |
| }) |
| } |
| |
| #[bench] |
| fn fmt_write(b: &mut Bencher) { |
| use std::fmt::Write; |
| let mut buf = BytesMut::with_capacity(128); |
| let s = "foo bar baz quux lorem ipsum dolor et"; |
| |
| b.bytes = s.len() as u64; |
| b.iter(|| { |
| let _ = write!(buf, "{}", s); |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }) |
| } |
| |
| #[bench] |
| fn bytes_mut_extend(b: &mut Bencher) { |
| let mut buf = BytesMut::with_capacity(256); |
| let data = [33u8; 32]; |
| |
| b.bytes = data.len() as u64 * 4; |
| b.iter(|| { |
| for _ in 0..4 { |
| buf.extend(&data); |
| } |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }); |
| } |
| |
| // BufMut for BytesMut vs Vec<u8> |
| |
| #[bench] |
| fn put_slice_bytes_mut(b: &mut Bencher) { |
| let mut buf = BytesMut::with_capacity(256); |
| let data = [33u8; 32]; |
| |
| b.bytes = data.len() as u64 * 4; |
| b.iter(|| { |
| for _ in 0..4 { |
| buf.put_slice(&data); |
| } |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }); |
| } |
| |
| #[bench] |
| fn put_u8_bytes_mut(b: &mut Bencher) { |
| let mut buf = BytesMut::with_capacity(256); |
| let cnt = 128; |
| |
| b.bytes = cnt as u64; |
| b.iter(|| { |
| for _ in 0..cnt { |
| buf.put_u8(b'x'); |
| } |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }); |
| } |
| |
| #[bench] |
| fn put_slice_vec(b: &mut Bencher) { |
| let mut buf = Vec::<u8>::with_capacity(256); |
| let data = [33u8; 32]; |
| |
| b.bytes = data.len() as u64 * 4; |
| b.iter(|| { |
| for _ in 0..4 { |
| buf.put_slice(&data); |
| } |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }); |
| } |
| |
| #[bench] |
| fn put_u8_vec(b: &mut Bencher) { |
| let mut buf = Vec::<u8>::with_capacity(256); |
| let cnt = 128; |
| |
| b.bytes = cnt as u64; |
| b.iter(|| { |
| for _ in 0..cnt { |
| buf.put_u8(b'x'); |
| } |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }); |
| } |
| |
| #[bench] |
| fn put_slice_vec_extend(b: &mut Bencher) { |
| let mut buf = Vec::<u8>::with_capacity(256); |
| let data = [33u8; 32]; |
| |
| b.bytes = data.len() as u64 * 4; |
| b.iter(|| { |
| for _ in 0..4 { |
| buf.extend_from_slice(&data); |
| } |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }); |
| } |
| |
| #[bench] |
| fn put_u8_vec_push(b: &mut Bencher) { |
| let mut buf = Vec::<u8>::with_capacity(256); |
| let cnt = 128; |
| |
| b.bytes = cnt as u64; |
| b.iter(|| { |
| for _ in 0..cnt { |
| buf.push(b'x'); |
| } |
| test::black_box(&buf); |
| unsafe { |
| buf.set_len(0); |
| } |
| }); |
| } |