From ba99e4ce5401426e8c34a1df452cee2a86f04e04 Mon Sep 17 00:00:00 2001 From: Guillaume Pinot Date: Thu, 17 Apr 2014 09:38:55 +0200 Subject: [PATCH] parallelisation of shootout-k-nucleotide --- src/test/bench/shootout-k-nucleotide.rs | 39 ++++++++++++++----------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/test/bench/shootout-k-nucleotide.rs b/src/test/bench/shootout-k-nucleotide.rs index a1daf45cea9..865b3a03726 100644 --- a/src/test/bench/shootout-k-nucleotide.rs +++ b/src/test/bench/shootout-k-nucleotide.rs @@ -11,8 +11,12 @@ // 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 input = Arc::new(input); - let mut frequencies = Table::new(); - generate_frequencies(&mut frequencies, input.as_slice(), 1); - print_frequencies(&frequencies, 1); + let nb_freqs: Vec<(uint, Future)> = range(1u, 3).map(|i| { + let input = input.clone(); + (i, Future::spawn(proc() generate_frequencies(input.as_slice(), i))) + }).collect(); + let occ_freqs: Vec> = OCCURRENCES.iter().map(|&occ| { + let input = input.clone(); + Future::spawn(proc() generate_frequencies(input.as_slice(), occ.len())) + }).collect(); - 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); + 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); } }