Lære meg Rust

Evigheter siden jeg skrev noe her nå. Må begynne å bruke denne siden litt igjen. Det er jo tross alt noen prosjekter som jeg drar i gang.

Uansett. Jobber med å lære meg programmeringsspråket Rust. Det er kjempegøy. Jeg har jo lusket meg gjennom et knippe programmeringsspråk gjennom tidene. Noen er morsomme, andre ikke. Jeg syntes C ikke var så ille, men C++ hater jeg. En gang i tiden laget jeg en ganske stor applikasjon i Perl. Tror det var oppe i 5-6000 linjer med kode. På den tiden hadde ikke Python fått skikkelig fotfeste. Det var ikke helt åpenbart at det kom til å vinne, så jeg valgte å skrive om koden i Ruby. Jeg elsket Ruby, men det er jo ikke noe man sier for høyt nå til dags. Python er greit, men jeg liker det ikke spesielt. Men Rust er gøy.

Vel. Jeg har løst et par oppgaver i Advent of Code 23 med Rust nå. I tillegg driver jeg å koder på en terminal UI basert omvendt polsk notasjon kalkulator. Også har jeg laget en ganske sprek primtall-algoritme.


use std::time::Instant;

fn main() {
    let start = Instant::now();

    //const MAX_NUMBER: usize = 4096;
    const MAX_NUMBER: usize = 2_usize.pow(32);
    let size_of_word: usize = usize::BITS as usize;

    let mut primes: Vec<usize> = vec![0; MAX_NUMBER / (2 * size_of_word)];
    primes[0] = 1;

    //Calculate all the odd number non-primes
    let mut p: usize = 3;
    while p * p < MAX_NUMBER {
        if (primes[p >> 7] >> ((p >> 1) & 0x3F)) & 1 == 0 {
            let mut i = p * p;
            while i < MAX_NUMBER {
                primes[i >> 7] |= 1 << ((i >> 1) & 0x3F);
                i += p + p;
            }
        }
        p += 2;
    }

    let duration1 = Instant::now() - start;

    // // collect all the primes in a vector
    // let mut prime_list: Vec<usize> = Vec::new();
    // prime_list.push(2);
    // for (index, element) in primes.iter().enumerate() {
    //     let vi_num = index*128;
    //     for bit in 0..=63 {
    //         if (element >> bit) & 1 == 0 {
    //             prime_list.push(vi_num + (2 * bit + 1));
    //         }
    //     }
    // }

       // count all the primes
       let mut prime_count: usize = 1;
       for element in primes.iter() {
           for bit in 0..=63 {
               if (element >> bit) & 1 == 0 {
                  prime_count += 1;
               }
           }
       }

    let duration2 = Instant::now() - start;

    println!("Calc duration:  {} ms", duration1.as_millis());
    println!("Total duration:  {} ms", duration2.as_millis());
    println!("Number of primes:   {}", prime_count);
}

Denne finner alle primtall i en U32 integer på ca 12 sekunder på min maskin (kun en tråd). Hvis jeg skal legge alle de tallene inn i en vektor (koden som er komentert ut), så tar det 20-30sekunder til da den må allokere en del minne. Skrive den til disk har jeg ikke prøvd, men det tar nå den tiden det tar.

Legg igjen en kommentar