繁体   English   中英

为什么我的 rust 比我的 C - memory 操作慢?

[英]Why is my rust slower than my C - memory manipulation?

我有两个最终产生相同Vec的实现,但是我的 C 实现大约是 Rust 实现的 2 倍。 这是我的实现:

extern { 
    fn array_test(buffer: *mut u8, length: u32);
}

fn main() {
    let mut vectest = Vec::<u8>::with_capacity(2 << 20);
    unsafe { // using C function
        vectest.set_len(2 << 20);
        let start = SystemTime::now();
        array_test(vectest.as_mut_ptr(), 2 << 20);
        let end = SystemTime::now();
        println!("C func took {:?}", end.duration_since(start));
    };

    let mut vectest2 = Vec::<u8>::with_capacity(2 << 20);
    unsafe { // pure Rust
        vectest2.set_len(2 << 20);
        let start = SystemTime::now();
        let vectest2_ptr = vectest2.as_mut_ptr();
        for i in (0..2 << 20).step_by(4) {
            *(vectest2_ptr.add(i) as *mut u32) = i as u32;
        }
        let end = SystemTime::now();
        println!("Rust took {:?}", end.duration_since(start));
    };
}

C function:

void array_test(char *buffer, unsigned int len) {
    for (unsigned int i = 0; i < len; i += 4) {
        (*(int *)(buffer+i)) = i;
    }
}

运行cargo run --release的时间结果的一个实例是:

C func took Ok(440.692µs)
Rust took Ok(921.658µs)

大约每次我运行它时,C 的完成速度都会快两倍。

这仅仅是因为我的 Rust 代码优化不佳吗? 如果是这样,我该怎么做才能缩小 C 和 Rust 之间的差距?

如果您重新编写循环:

for i in (0..2 << 20).step_by(4) {
   *(vectest2_ptr.add(i) as *mut u32) = i as u32;
}

作为

let mut i = 0;
while i <= (2 << 20) {
   *(vectest2_ptr.add(i) as *mut u32) = i as u32;
    i += 4;
}

您看到的性能差异消失了。

快速浏览 rust.godbolt.org上的程序集(使用 -O 作为 rustc 的参数),看起来 rustc/llvm 在使用while变体时能够对循环进行矢量化(使用 SIMD),但它不适用对你的 for 循环进行同样的优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM