Optimization 如何加速Vec<;布尔>;在我的埃拉托什尼筛子里?

Optimization 如何加速Vec<;布尔>;在我的埃拉托什尼筛子里?,optimization,vector,rust,Optimization,Vector,Rust,为什么在Rust中直接实现筛网的速度如此之慢,如何加快 use std::num::Float; use std::iter::range_step; fn eratosthenes(n: uint) -> Vec<bool> { let mut sieve = Vec::from_elem(n+1,true); sieve[0] = false; sieve[1] = false; let m = ((n as f64).sqrt())

为什么在Rust中直接实现筛网的速度如此之慢,如何加快

use std::num::Float;
use std::iter::range_step;

fn eratosthenes(n: uint) -> Vec<bool> {
    let mut sieve = Vec::from_elem(n+1,true);

    sieve[0] = false;
    sieve[1] = false;

    let m = ((n as f64).sqrt()) as uint;

    for i in range(0u, m+1) {
        if sieve[i] {
            for j in range_step(i*i, n+1, i) {
                sieve[j] = false;
            }
        }
    }
    sieve
}

fn main() {
    eratosthenes(100_000_000);
    /*    
    let mut found = Vec::new();
    for (i,&sieve) in sieve.iter().enumerate() {
        if sieve {
            found.push(i);
        }
    }
    println!("Primes found: {}",found.len());
    */
}
使用std::num::Float;
使用std::iter::range\u步骤;
fn埃拉托斯坦(n:uint)->Vec{
设mut sieve=Vec::from_elem(n+1,true);
筛[0]=假;
筛[1]=假;
设m=(n为f64.sqrt())为uint;
适用于范围内的i(0u,m+1){
如果筛[i]{
对于范围内的j_阶跃(i*i,n+1,i){
筛[j]=假;
}
}
}
筛
}
fn main(){
埃拉托什尼(10万);
/*    
让mut found=Vec::new();
对于sieve.iter()枚举()中的(i,&sieve){
如果筛{
发现。推(i);
}
}
println!(“找到的素数:{}”,找到的.len();
*/
}

附言:我不是在问一个更好的算法,而是如何正确地使用Vec(Slice?)使其速度相当快

-O
编译,我会使用一个包含找到的数字的集合。除此之外,使用探查器找出最耗时的部分。使用-O进行编译可使其速度提高13倍,并使其达到我预期的范围!这就是诀窍吗?否“最好使用其他类型/切片,而不是您所做的?”@乌尔里切克哈特:我想一盘会慢一些。但它可能会节省内存。您可以使用
std::collections::Bitv
,这实际上是一种
Vec
,它将布尔值打包成单个位,将内存使用量减少8倍,从而显著改善缓存行为。@OderWat听起来您应该将所有这些总结为一个自我回答!