use char instead of &str for single char patterns by matthiaskrgr · Pull Request #69481 · rust-lang/rust (original) (raw)
When running these benchmarks that I found via the discussion you linked
#![feature(test)]
extern crate test; use crate::test::black_box; use crate::test::Bencher;
fn main() { println!("Hello, world!"); }
#[bench] fn starts_with_char(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.starts_with('k')); } }) }
#[bench] fn starts_with_str(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.starts_with("k")); } }) }
#[bench] fn ends_with_char(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.ends_with('k')); } }) }
#[bench] fn ends_with_str(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.ends_with("k")); } }) }
, char is consistently faster for me with default optimization levels:
running 4 tests
test ends_with_char ... bench: 465 ns/iter (+/- 31)
test ends_with_str ... bench: 544 ns/iter (+/- 79)
test starts_with_char ... bench: 356 ns/iter (+/- 38)
test starts_with_str ... bench: 691 ns/iter (+/- 10)
running 4 tests
test ends_with_char ... bench: 464 ns/iter (+/- 10)
test ends_with_str ... bench: 544 ns/iter (+/- 15)
test starts_with_char ... bench: 355 ns/iter (+/- 11)
test starts_with_str ... bench: 692 ns/iter (+/- 11)
running 4 tests
test ends_with_char ... bench: 448 ns/iter (+/- 11)
test ends_with_str ... bench: 527 ns/iter (+/- 2)
test starts_with_char ... bench: 340 ns/iter (+/- 33)
test starts_with_str ... bench: 670 ns/iter (+/- 8)