diff options
| author | Thom Chiovoloni <tchiovoloni@mozilla.com> | 2020-07-05 14:33:27 -0700 |
|---|---|---|
| committer | Thom Chiovoloni <tchiovoloni@mozilla.com> | 2020-07-05 14:33:27 -0700 |
| commit | e1d4db605581097742e8fc236ba7f0a0890aa93f (patch) | |
| tree | d6f8528c8a44d3986870a03db27805964a37f660 /src/libcore | |
| parent | 63e2e2e32674ebe662b927c139931ffd8a352313 (diff) | |
Add benchmark for slice is_ascii using align_to
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/benches/ascii.rs | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/libcore/benches/ascii.rs b/src/libcore/benches/ascii.rs index 96f2b9a90c6..61763dd8268 100644 --- a/src/libcore/benches/ascii.rs +++ b/src/libcore/benches/ascii.rs @@ -74,8 +74,9 @@ macro_rules! benches { #[bench] fn $name(bencher: &mut Bencher) { bencher.bytes = $input.len() as u64; - let vec = $input.as_bytes().to_vec(); + let mut vec = $input.as_bytes().to_vec(); bencher.iter(|| { + black_box(&mut vec); let $arg = black_box(&vec[..]); black_box($body) }) @@ -278,6 +279,28 @@ benches! { fn is_ascii_slice_iter_all(bytes: &[u8]) { bytes.iter().all(|b| b.is_ascii()) } + + fn is_ascii_slice_align_to(bytes: &[u8]) { + is_ascii_align_to_impl(bytes) + } +} + +// Separate since it's easier to debug errors if they don't go through macro +// expansion first. +fn is_ascii_align_to_impl(bytes: &[u8]) -> bool { + if bytes.len() < core::mem::size_of::<usize>() { + return bytes.iter().all(|b| b.is_ascii()); + } + let (head, body, tail) = unsafe { bytes.align_to::<usize>() }; + head.iter().all(|b| b.is_ascii()) && + body.iter().all(|w| !contains_nonascii(*w)) && + tail.iter().all(|b| b.is_ascii()) +} + +#[inline] +fn contains_nonascii(v: usize) -> bool { + const NONASCII_MASK: usize = 0x80808080_80808080u64 as usize; + (NONASCII_MASK & v) != 0 } macro_rules! repeat { |
