Rustのコンパイルオプション—debug vs —releaseで作成された実行ファイルの速度差

Rustのドキュメントによれば、–debugオプションと–releaseオプションで作成されたバイナリの実行速度差は10倍から最大100倍といっていますが、実際のサンプルでどうなるかみてみた

<環境>

M1 Macbook Airとラズパイzero W

百万までの素数を求めてベクターに格納、比較対象はGolnagでの実行速度、

Golangのコードはこちら、

https://github.com/chateight/golang/blob/master/concpara/waitGroup.go

Rustのコードは省力化のためにGeminiで作成、ただしマルチスレッド周りでたくさんエラー出たからシングルスレッド化して動かしてみた、マルチスレッド対応のコードは多少残存しているけど、比較の目的にはそれほど影響ないだろうからそのまま

use std::sync::{Arc, Mutex};
use std::time::Instant;

fn main() {
    let start_time = Instant::now();
    let num = find_primes(2, 10000 * 100);
    println!("{}",num.len());
    let end_time = Instant::now();
    println!("Elapsed time: {:?}", end_time.duration_since(start_time));
}

fn find_primes(start: i32, end: i32) -> Vec<i32>{
    let counter = Arc::new(Mutex::new(start)); // Shared counter for prime candidates

    let mut value = Vec::new();
    let counter_clone = counter.clone();

    loop {
        let c = counter_clone.lock().unwrap().clone();
        if c > end {
            break;
        }

        let mut flag = true;
        for j in 2..((c as f64).sqrt() as i32 + 1) {
            if c % j == 0 {
                flag = false;
                break;
            }
        }

        if flag {
            value.push(c);
        }

        *counter_clone.lock().unwrap() += 1;
    }
    value
}

結果:素数の数は重要ではないけれども、ロジック検証用

@MacBook Air M1

<Golangでの百万までの素数計算>
78498	; 素数の数
440.783125ms ; 実行時間

<rust build>
78498
Elapsed time: 508.7235ms

<rust release>
78498
Elapsed time: 91.830167ms


@Raspberry pi zero W
<rust build>
78498
Elapsed time: 18.59699031s

<rust release>
78498
Elapsed time: 7.10051562s

–debugバイナリと–releaseバイナリの実行速度差はM1 Macだと6倍弱、ラズパイzeroだと2倍程度で予想したほどの差はないというのが実感、M1 Macとラズパイzeroの速度差は安定の数十倍

Golangはマルチスレッドにしてマルチコアを使ったつもりだけれども、Rustに比較するとアドバンテージはなさそうに見える

 

admin

 

 

カテゴリーRust