为什么在Rust中遍历整数向量比在Python,C#和C ++中慢?

时间:2018-12-26 00:08:55

标签: performance rust

我现在正在学习Rust,并且正在使用这个简单的Erathostenes实现筛子:

fn get_primes(known_primes: &Vec<i64>, start: i64, stop: i64) -> Vec<i64> {
    let mut new_primes = Vec::new();
    for number in start..stop {
        let mut is_prime = true;
        let limit = (number as f64).sqrt() as i64;
        for prime in known_primes {
            if number % prime == 0 {
                is_prime = false;
                break;
            }
            if *prime > limit {
                break;
            }
        }
        if is_prime {
            new_primes.push(number);
        }
    }
    return new_primes;
}

我正在将其与Python(带numba),C#和C ++(gcc / clang)中几乎相同的代码(模语法)进行比较。所有这些都比我的机器上的实现快3倍。

我正在发布模式下编译。确切地说,我已将其添加到Cargo.toml中,它似乎具有相同的效果:

[profile.dev]
opt-level = 3 

我还检查了工具链,MSVC和GNU之间有微小的差异(大约15%),但是没有什么可以解释这个差距。

我在这里出问题了吗?我在某处复印吗?

此代码是否等效于以下C ++代码?

vector<int> getPrimes(vector<int> &knownPrimes, int start, int stop) {
    vector<int> newPrimes;
    for (int number = start; number < stop; number += 1) {
        bool isPrime = true;
        int limit = (int)sqrt(number);
        for (auto& prime : knownPrimes) {
            if (number % prime == 0) {
                isPrime = false;
                break;
            }
            if (prime > limit)
                break;
        }
        if (isPrime) {
            newPrimes.push_back(number);
        }
    }
    return newPrimes;
}

1 个答案:

答案 0 :(得分:1)

C ++ int的大小取决于目标体系结构,编译器选项等。在Rust代码中,您明确声明了64位整数。您可能正在使用不同的基础类型大小来比较代码。