135 lines
3.5 KiB
Rust
135 lines
3.5 KiB
Rust
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
use std::iter::repeat;
|
|
use test::Bencher;
|
|
|
|
#[bench]
|
|
fn bench_with_capacity(b: &mut Bencher) {
|
|
b.iter(|| String::with_capacity(100));
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_push_str(b: &mut Bencher) {
|
|
let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
|
|
b.iter(|| {
|
|
let mut r = String::new();
|
|
r.push_str(s);
|
|
});
|
|
}
|
|
|
|
const REPETITIONS: u64 = 10_000;
|
|
|
|
#[bench]
|
|
fn bench_push_str_one_byte(b: &mut Bencher) {
|
|
b.bytes = REPETITIONS;
|
|
b.iter(|| {
|
|
let mut r = String::new();
|
|
for _ in 0..REPETITIONS {
|
|
r.push_str("a")
|
|
}
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_push_char_one_byte(b: &mut Bencher) {
|
|
b.bytes = REPETITIONS;
|
|
b.iter(|| {
|
|
let mut r = String::new();
|
|
for _ in 0..REPETITIONS {
|
|
r.push('a')
|
|
}
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_push_char_two_bytes(b: &mut Bencher) {
|
|
b.bytes = REPETITIONS * 2;
|
|
b.iter(|| {
|
|
let mut r = String::new();
|
|
for _ in 0..REPETITIONS {
|
|
r.push('â')
|
|
}
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn from_utf8_lossy_100_ascii(b: &mut Bencher) {
|
|
let s = b"Hello there, the quick brown fox jumped over the lazy dog! \
|
|
Lorem ipsum dolor sit amet, consectetur. ";
|
|
|
|
assert_eq!(100, s.len());
|
|
b.iter(|| {
|
|
let _ = String::from_utf8_lossy(s);
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn from_utf8_lossy_100_multibyte(b: &mut Bencher) {
|
|
let s = "𐌀𐌖𐌋𐌄𐌑𐌉ปรدولة الكويتทศไทย中华𐍅𐌿𐌻𐍆𐌹𐌻𐌰".as_bytes();
|
|
assert_eq!(100, s.len());
|
|
b.iter(|| {
|
|
let _ = String::from_utf8_lossy(s);
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn from_utf8_lossy_invalid(b: &mut Bencher) {
|
|
let s = b"Hello\xC0\x80 There\xE6\x83 Goodbye";
|
|
b.iter(|| {
|
|
let _ = String::from_utf8_lossy(s);
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn from_utf8_lossy_100_invalid(b: &mut Bencher) {
|
|
let s = repeat(0xf5).take(100).collect::<Vec<_>>();
|
|
b.iter(|| {
|
|
let _ = String::from_utf8_lossy(&s);
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_exact_size_shrink_to_fit(b: &mut Bencher) {
|
|
let s = "Hello there, the quick brown fox jumped over the lazy dog! \
|
|
Lorem ipsum dolor sit amet, consectetur. ";
|
|
// ensure our operation produces an exact-size string before we benchmark it
|
|
let mut r = String::with_capacity(s.len());
|
|
r.push_str(s);
|
|
assert_eq!(r.len(), r.capacity());
|
|
b.iter(|| {
|
|
let mut r = String::with_capacity(s.len());
|
|
r.push_str(s);
|
|
r.shrink_to_fit();
|
|
r
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_from_str(b: &mut Bencher) {
|
|
let s = "Hello there, the quick brown fox jumped over the lazy dog! \
|
|
Lorem ipsum dolor sit amet, consectetur. ";
|
|
b.iter(|| String::from(s))
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_from(b: &mut Bencher) {
|
|
let s = "Hello there, the quick brown fox jumped over the lazy dog! \
|
|
Lorem ipsum dolor sit amet, consectetur. ";
|
|
b.iter(|| String::from(s))
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_to_string(b: &mut Bencher) {
|
|
let s = "Hello there, the quick brown fox jumped over the lazy dog! \
|
|
Lorem ipsum dolor sit amet, consectetur. ";
|
|
b.iter(|| s.to_string())
|
|
}
|