簡體   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