结果在我的 M2 Mac mini 上,
- 有边界检查: 1152 ms
- 无边界检查: 1084 ms

基本是 6% 左右的时间开销(不确定我这个封装是否有额外开销).

附源代码:
```rust
struct Array<T>(*mut T);

impl<T> From<*const T> for Array<T> {
    fn from(ptr: *const T) -> Self {
        Self(ptr as *mut _)
    }
}

impl<T> std::ops::Index<usize> for Array<T> {
    type Output = T;
    fn index(&self, index: usize) -> &Self::Output {
        unsafe {
            let ptr = self.0.offset(index as isize);
            &*ptr
        }
    }
}
impl<T> std::ops::IndexMut<usize> for Array<T> {
    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
        unsafe {
            let ptr = self.0.offset(index as isize);
            &mut *ptr
        }
    }
}

fn main() {
    const SIZE: usize = 1024 * 1024;
    const LOOP: usize = 2_000_000;

    let mut arr = vec![0u32; SIZE];
    let start = std::time::Instant::now();
    // array indexing with boundary check
    {
        for _ in 0..LOOP {
            let index = rand::random::<usize>() % SIZE;
            arr[index] += 1;
        }
    }
    let elapsed = start.elapsed();
    println!("Array indexing with boundary check runtime: {}ms", elapsed.as_millis());

    // to avoid cache, use a different raw array.
    let mut arr = Array::from(vec![0u32; SIZE].as_ptr());
    let start = std::time::Instant::now();
    // array indexing wthout boundary check
    {
        for _ in 0..LOOP {
            let index = rand::random::<usize>() % SIZE;
            arr[index] += 1;
        }
    }
    let elapsed = start.elapsed();
    println!("Array indexing without boundary check runtime: {}ms", elapsed.as_millis());
   
}
```
举报· 100 次点击
登录 注册 站外分享
4 条回复  
nagisaushio 小成 2024-8-30 21:59:08
为啥不直接用 get_mut
gwy15 小成 2024-8-30 23:28:11
1. 你可以直接 get_unchecked
2. 有 use-after-drop ,你这不是 unsafe 是 unsound
3. Array 这个命名是错误的,应该叫 Pointer ,里面没有存长度
4. 你可以直接看 asm 确定有没有优化掉边界检查
槽点太多了……建议多看代码和文档,思而不学也不行
Kauruus 小成 2024-8-31 12:06:57
之前有人做过测试,以 C 为基线,Rust 的运行时检测大约带来 1.77x 的损耗,其中 bound check 大约占 50%。

https://dl.acm.org/doi/fullHtml/10.1145/3551349.3559494
whoami9894 小成 2024-9-2 15:13:24
编译器又不傻,`index % SIZE`,bounds check 绝对被优化掉了
返回顶部