primes/
primes.rs

1#[inline(never)]
2fn is_prime_number(v: usize, prime_numbers: &[usize]) -> bool {
3    if v < 10000 {
4        let r = prime_numbers.binary_search(&v);
5        return r.is_ok();
6    }
7
8    for n in prime_numbers {
9        if v % n == 0 {
10            return false;
11        }
12    }
13
14    true
15}
16
17#[inline(never)]
18fn prepare_prime_numbers() -> Vec<usize> {
19    // bootstrap: Generate a prime table of 0..10000
20    let mut prime_number_table: [bool; 10000] = [true; 10000];
21    prime_number_table[0] = false;
22    prime_number_table[1] = false;
23    for i in 2..10000 {
24        if prime_number_table[i] {
25            let mut v = i * 2;
26            while v < 10000 {
27                prime_number_table[v] = false;
28                v += i;
29            }
30        }
31    }
32    let mut prime_numbers = vec![];
33    for i in 2..10000 {
34        if prime_number_table[i] {
35            prime_numbers.push(i);
36        }
37    }
38    prime_numbers
39}
40
41fn main() {
42    let prime_numbers = prepare_prime_numbers();
43
44    gperftools_static::PROFILER
45        .lock()
46        .unwrap()
47        .start("/tmp/prime.target")
48        .unwrap();
49
50    let mut v = 0;
51    for i in 2..50000 {
52        if is_prime_number(i, &prime_numbers) {
53            v += 1;
54        }
55    }
56
57    gperftools_static::PROFILER.lock().unwrap().stop().unwrap();
58
59    println!("Prime numbers: {}", v);
60}