mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-10 00:00:09 +02:00
Bytes is a useful tool for managing multiple slices into the same region of memory, and the other things it used to have been removed to reduce complexity. The exact strategy for managing the multiple references is no longer hard-coded, but instead backing by a customizable vtable. - Removed ability to mutate the underlying memory from the `Bytes` type. - Removed the "inline" (SBO) mechanism in `Bytes`. The reduces a large amount of complexity, and improves performance when accessing the slice of bytes, since a branch is no longer needed to check if the data is inline. - Removed `Bytes` knowledge of `BytesMut` (`BytesMut` may grow that knowledge back at a future point.)
119 lines
2.4 KiB
Rust
119 lines
2.4 KiB
Rust
#![feature(test)]
|
|
#![deny(warnings, rust_2018_idioms)]
|
|
|
|
extern crate test;
|
|
|
|
use test::Bencher;
|
|
use bytes::Bytes;
|
|
|
|
#[bench]
|
|
fn deref_unique(b: &mut Bencher) {
|
|
let buf = Bytes::from(vec![0; 1024]);
|
|
|
|
b.iter(|| {
|
|
for _ in 0..1024 {
|
|
test::black_box(&buf[..]);
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn deref_shared(b: &mut Bencher) {
|
|
let buf = Bytes::from(vec![0; 1024]);
|
|
let _b2 = buf.clone();
|
|
|
|
b.iter(|| {
|
|
for _ in 0..1024 {
|
|
test::black_box(&buf[..]);
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn deref_static(b: &mut Bencher) {
|
|
let buf = Bytes::from_static(b"hello world");
|
|
|
|
b.iter(|| {
|
|
for _ in 0..1024 {
|
|
test::black_box(&buf[..]);
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn clone_static(b: &mut Bencher) {
|
|
let bytes = Bytes::from_static("hello world 1234567890 and have a good byte 0987654321".as_bytes());
|
|
|
|
b.iter(|| {
|
|
for _ in 0..1024 {
|
|
test::black_box(&bytes.clone());
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn clone_shared(b: &mut Bencher) {
|
|
let bytes = Bytes::from(b"hello world 1234567890 and have a good byte 0987654321".to_vec());
|
|
|
|
b.iter(|| {
|
|
for _ in 0..1024 {
|
|
test::black_box(&bytes.clone());
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn clone_arc_vec(b: &mut Bencher) {
|
|
use std::sync::Arc;
|
|
let bytes = Arc::new(b"hello world 1234567890 and have a good byte 0987654321".to_vec());
|
|
|
|
b.iter(|| {
|
|
for _ in 0..1024 {
|
|
test::black_box(&bytes.clone());
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn from_long_slice(b: &mut Bencher) {
|
|
let data = [0u8; 128];
|
|
b.bytes = data.len() as u64;
|
|
b.iter(|| {
|
|
let buf = Bytes::copy_from_slice(&data[..]);
|
|
test::black_box(buf);
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn slice_empty(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
let b = Bytes::from(vec![17; 1024]).clone();
|
|
for i in 0..1000 {
|
|
test::black_box(b.slice(i % 100..i % 100));
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn slice_short_from_arc(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
// `clone` is to convert to ARC
|
|
let b = Bytes::from(vec![17; 1024]).clone();
|
|
for i in 0..1000 {
|
|
test::black_box(b.slice(1..2 + i % 10));
|
|
}
|
|
})
|
|
}
|
|
|
|
#[bench]
|
|
fn split_off_and_drop(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
for _ in 0..1024 {
|
|
let v = vec![10; 200];
|
|
let mut b = Bytes::from(v);
|
|
test::black_box(b.split_off(100));
|
|
test::black_box(b);
|
|
}
|
|
})
|
|
}
|