我的代码中哪部分过滤质数会导致它在处理过程中变慢?

时间:2018-12-23 16:09:01

标签: performance rust

我在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标志进行构建。我知道不这样做可能会使事情进一步放慢速度。

1 个答案:

答案 0 :(得分:1)

减慢执行速度的函数是:

is_prime(i: i32) 

您可以考虑使用更高效的板条箱,例如primes,也可以检查高效的素数检查算法here