假设我们想快速找到数组中第一个非零元素的索引,效果如下
fn leading_zeros(arr: &[u32]) -> Option<usize> {
arr.iter().position(|&x| x != 0)
}
Run Code Online (Sandbox Code Playgroud)
但是,这会被编译为逐一检查,rustc如下所示。u128通过使用如下类型检查单词 4 by 4,可以稍微加快速度。这使我的机器的速度提高了大约 3 倍。
fn leading_zeros_wide(arr: &[u32]) -> Option<usize> {
let (beg, mid, _) = unsafe { arr.align_to::<u128>() };
beg.iter().position(|&x| x != 0).or_else(|| {
let left = beg.len() + 4 * mid.iter().position(|&x| x != 0).unwrap_or(mid.len());
arr[left..].iter().position(|&x| x != 0).map(|p| p + left)
})
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让它更快?
这是我用来确定 3 倍加速的基准:
#![feature(test)]
extern crate test;
fn v() -> Box<[u32]> {
std::iter::repeat(0).take(1000).collect()
}
// …Run Code Online (Sandbox Code Playgroud)