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)