mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 01:07:15 +03:00
8029cd3878
Summary: Performance looks okay comparing with tokio/bytes v0.5.4: minibytes: test clone_arc_vec ... bench: 16,542 ns/iter (+/- 1,524) test clone_shared ... bench: 16,211 ns/iter (+/- 596) test clone_static ... bench: 1,437 ns/iter (+/- 502) test deref_shared ... bench: 367 ns/iter (+/- 101) test deref_static ... bench: 366 ns/iter (+/- 1) test deref_unique ... bench: 367 ns/iter (+/- 4) test from_long_slicd ... bench: 91 ns/iter (+/- 18) = 1406 MB/s test slice_empty ... bench: 10,382 ns/iter (+/- 104) test slice_short_from_arc ... bench: 23,823 ns/iter (+/- 1,411) tokio/bytes: test clone_arc_vec ... bench: 16,213 ns/iter (+/- 1,864) test clone_shared ... bench: 18,685 ns/iter (+/- 634) test clone_static ... bench: 3,983 ns/iter (+/- 163) test deref_shared ... bench: 366 ns/iter (+/- 26) test deref_static ... bench: 373 ns/iter (+/- 36) test deref_unique ... bench: 391 ns/iter (+/- 33) test from_long_slice ... bench: 67 ns/iter (+/- 7) = 1910 MB/s test slice_empty ... bench: 15,149 ns/iter (+/- 1,708) test slice_short_from_arc ... bench: 36,541 ns/iter (+/- 3,485) clone_static is faster because minibytes don't call into vtable's clone. from_long_slice is slower because minibytes uses Arc unconditionally while bytes can avoid Arc overhead if refcount is 1. Reviewed By: DurhamG Differential Revision: D19770857 fbshipit-source-id: 5bafcc57a38c68baccfcafd3906f1a47b2bf4530
140 lines
3.4 KiB
Rust
140 lines
3.4 KiB
Rust
/*
|
|
* Portions Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This software may be used and distributed according to the terms of the
|
|
* GNU General Public License version 2.
|
|
*/
|
|
|
|
/* Copyright (c) 2018 Carl Lerche
|
|
*
|
|
* Permission is hereby granted, free of charge, to any
|
|
* person obtaining a copy of this software and associated
|
|
* documentation files (the "Software"), to deal in the
|
|
* Software without restriction, including without
|
|
* limitation the rights to use, copy, modify, merge,
|
|
* publish, distribute, sublicense, and/or sell copies of
|
|
* the Software, and to permit persons to whom the Software
|
|
* is furnished to do so, subject to the following
|
|
* conditions:
|
|
*
|
|
* The above copyright notice and this permission notice
|
|
* shall be included in all copies or substantial portions
|
|
* of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
#![feature(test)]
|
|
|
|
extern crate test;
|
|
|
|
use minibytes::Bytes;
|
|
use test::Bencher;
|
|
|
|
#[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));
|
|
}
|
|
})
|
|
}
|