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