[英]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.