我现在正在学习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;
}
答案 0 :(得分:1)
C ++ int
的大小取决于目标体系结构,编译器选项等。在Rust代码中,您明确声明了64位整数。您可能正在使用不同的基础类型大小来比较代码。