]> git.lizzy.rs Git - rust.git/commitdiff
parallelisation of shootout-k-nucleotide
authorGuillaume Pinot <texitoi@texitoi.eu>
Thu, 17 Apr 2014 07:38:55 +0000 (09:38 +0200)
committerGuillaume Pinot <texitoi@texitoi.eu>
Thu, 17 Apr 2014 07:38:55 +0000 (09:38 +0200)
src/test/bench/shootout-k-nucleotide.rs

index a1daf45cea9025e113806b3a105b94b9da2cd55f..865b3a03726715d08280998ebf6ec3b075999647 100644 (file)
 // ignore-android see #10393 #13206
 // ignore-pretty
 
+extern crate sync;
+
 use std::strbuf::StrBuf;
 use std::slice;
+use sync::Arc;
+use sync::Future;
 
 static TABLE: [u8, ..4] = [ 'A' as u8, 'C' as u8, 'G' as u8, 'T' as u8 ];
 static TABLE_SIZE: uint = 2 << 16;
@@ -202,10 +206,9 @@ fn unpack_symbol(c: u8) -> u8 {
     TABLE[c as uint]
 }
 
-fn generate_frequencies(frequencies: &mut Table,
-                        mut input: &[u8],
-                        frame: uint) {
-    if input.len() < frame { return; }
+fn generate_frequencies(mut input: &[u8], frame: uint) -> Table {
+    let mut frequencies = Table::new();
+    if input.len() < frame { return frequencies; }
     let mut code = Code(0);
 
     // Pull first frame.
@@ -220,6 +223,7 @@ fn generate_frequencies(frequencies: &mut Table,
         frequencies.lookup(code, BumpCallback);
         input = input.slice_from(1);
     }
+    frequencies
 }
 
 fn print_frequencies(frequencies: &Table, frame: uint) {
@@ -266,20 +270,21 @@ fn main() {
     } else {
         get_sequence(&mut std::io::stdin(), ">THREE")
     };
-
-    let mut frequencies = Table::new();
-    generate_frequencies(&mut frequencies, input.as_slice(), 1);
-    print_frequencies(&frequencies, 1);
-
-    frequencies = Table::new();
-    generate_frequencies(&mut frequencies, input.as_slice(), 2);
-    print_frequencies(&frequencies, 2);
-
-    for occurrence in OCCURRENCES.iter() {
-        frequencies = Table::new();
-        generate_frequencies(&mut frequencies,
-                             input.as_slice(),
-                             occurrence.len());
-        print_occurrences(&mut frequencies, *occurrence);
+    let input = Arc::new(input);
+
+    let nb_freqs: Vec<(uint, Future<Table>)> = range(1u, 3).map(|i| {
+        let input = input.clone();
+        (i, Future::spawn(proc() generate_frequencies(input.as_slice(), i)))
+    }).collect();
+    let occ_freqs: Vec<Future<Table>> = OCCURRENCES.iter().map(|&occ| {
+        let input = input.clone();
+        Future::spawn(proc() generate_frequencies(input.as_slice(), occ.len()))
+    }).collect();
+
+    for (i, freq) in nb_freqs.move_iter() {
+        print_frequencies(&freq.unwrap(), i);
+    }
+    for (&occ, freq) in OCCURRENCES.iter().zip(occ_freqs.move_iter()) {
+        print_occurrences(&mut freq.unwrap(), occ);
     }
 }