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