コンパイルのoptimizeオプション(@Rust)

Beginning Rustに出てくるコードですが、rustcに -Oというコンパイルオプションがありますが、以下のコードで-Oを指定しないと何回か実行するとその都度時間は変わってきますが、この程度の処理時間、

実行環境はM1 Mac 16GB/512GB、rustc 1.79.0です

5.14425ms 1.031666ms

ここでrustic -Oでコンパイルすると、

584.666µs 84ns

この数字はwhileループを丸々パス、全く処理しないでvdをクリアしているだけに見えます。

fn main() {
    use std::time::Instant;
    const SIZE: usize = 40_000;
    let start_time = Instant::now();
    let mut vd = std::collections::VecDeque::<usize>::new();
    for i in 0..SIZE {
        vd.push_back(i);
        vd.push_back(SIZE + i);
        vd.pop_front();
        vd.push_back(SIZE * 2 + i);
        vd.pop_front();
    }
    let t1 = start_time.elapsed();
    while vd.len() > 0 {
        vd.pop_front();
    }
    let t2 = start_time.elapsed();
    print!("{:?} {:?}", t1, t2 - t1);
}

で、コンパイラが手抜きをさせないように、毎回結果を使うように書き換えると、

    while vd.len() > 0 {
        sum += vd.pop_front().unwrap();
    }
    let t2 = start_time.elapsed();
    print!("{:?} {:?} {}", t1, t2 - t1, sum);
386.083µs 81.209µs 2933353333

こちらはまともそうに見えます。コンパイルオプションで処理時間が著しく異なるときは実はコードが冗長というケースもありそうだよねということです、

 

admin

カテゴリーRust