我在Project Euler上遇到了一些问题。这个挑战需要从数组中过滤素数。当我发现Rust有点慢时,我已经接近解决方案的一半了。我添加了progressbar来检查进度。
这是代码: 外部木箱pbr;
use self::pbr::ProgressBar;
pub fn is_prime(i: i32) -> bool {
for d in 2..i {
if i % d == 0 {
return false;
}
}
true
}
pub fn calc_sum_loop(max_num: i32) -> i32 {
let mut pb = ProgressBar::new(max_num as u64);
pb.format("[=>_]");
let mut sum_primes = 0;
for i in 1..max_num {
if is_prime(i) {
sum_primes += i;
}
pb.inc();
}
sum_primes
}
pub fn solve() {
println!("About to calculate sum of primes in the first 20000");
println!("When using a forloop {:?}", calc_sum_loop(400000));
}
我正在从solve
文件中调用main.rs
函数。事实证明,我的for循环中的迭代次数在开始时要快得多,而在以后要慢得多。
➜ euler-rust git:(master) ✗ cargo run --release
Finished release [optimized] target(s) in 0.05s
Running `target/release/euler-rust`
About to calculate sum of primes..
118661 / 400000 [===========>__________________________] 29.67 % 48780.25/s 6s
...
...
400000 / 400000 [=======================================] 100.00 % 23725.24/s
对于造成这种速度下降的原因,我有点空白。感觉Rust应该能够比我现在看到的更快。请注意,我告诉Cargo使用--release
标志进行构建。我知道不这样做可能会使事情进一步放慢速度。