Skip to content

Commit e1d4db6

Browse files
author
Thom Chiovoloni
committed
Add benchmark for slice is_ascii using align_to
1 parent 63e2e2e commit e1d4db6

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

src/libcore/benches/ascii.rs

+24-1
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@ macro_rules! benches {
7474
#[bench]
7575
fn $name(bencher: &mut Bencher) {
7676
bencher.bytes = $input.len() as u64;
77-
let vec = $input.as_bytes().to_vec();
77+
let mut vec = $input.as_bytes().to_vec();
7878
bencher.iter(|| {
79+
black_box(&mut vec);
7980
let $arg = black_box(&vec[..]);
8081
black_box($body)
8182
})
@@ -278,6 +279,28 @@ benches! {
278279
fn is_ascii_slice_iter_all(bytes: &[u8]) {
279280
bytes.iter().all(|b| b.is_ascii())
280281
}
282+
283+
fn is_ascii_slice_align_to(bytes: &[u8]) {
284+
is_ascii_align_to_impl(bytes)
285+
}
286+
}
287+
288+
// Separate since it's easier to debug errors if they don't go through macro
289+
// expansion first.
290+
fn is_ascii_align_to_impl(bytes: &[u8]) -> bool {
291+
if bytes.len() < core::mem::size_of::<usize>() {
292+
return bytes.iter().all(|b| b.is_ascii());
293+
}
294+
let (head, body, tail) = unsafe { bytes.align_to::<usize>() };
295+
head.iter().all(|b| b.is_ascii()) &&
296+
body.iter().all(|w| !contains_nonascii(*w)) &&
297+
tail.iter().all(|b| b.is_ascii())
298+
}
299+
300+
#[inline]
301+
fn contains_nonascii(v: usize) -> bool {
302+
const NONASCII_MASK: usize = 0x80808080_80808080u64 as usize;
303+
(NONASCII_MASK & v) != 0
281304
}
282305

283306
macro_rules! repeat {

0 commit comments

Comments
 (0)