小编MER*_*TON的帖子

如何有效地找到数组中的第一个非零?

假设我们想快速找到数组中第一个非零元素的索引,效果如下

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)

simd rust

9
推荐指数
1
解决办法
1469
查看次数

标签 统计

rust ×1

simd ×1