Skip to content

Commit 0c23140

Browse files
committed
auto merge of #13575 : TeXitoi/rust/shootout-knucleotide-parallel, r=alexcrichton
2 parents 9503129 + ba99e4c commit 0c23140

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

src/test/bench/shootout-k-nucleotide.rs

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@
1111
// ignore-android see #10393 #13206
1212
// ignore-pretty
1313

14+
extern crate sync;
15+
1416
use std::strbuf::StrBuf;
1517
use std::slice;
18+
use sync::Arc;
19+
use sync::Future;
1620

1721
static TABLE: [u8, ..4] = [ 'A' as u8, 'C' as u8, 'G' as u8, 'T' as u8 ];
1822
static TABLE_SIZE: uint = 2 << 16;
@@ -202,10 +206,9 @@ fn unpack_symbol(c: u8) -> u8 {
202206
TABLE[c as uint]
203207
}
204208

205-
fn generate_frequencies(frequencies: &mut Table,
206-
mut input: &[u8],
207-
frame: uint) {
208-
if input.len() < frame { return; }
209+
fn generate_frequencies(mut input: &[u8], frame: uint) -> Table {
210+
let mut frequencies = Table::new();
211+
if input.len() < frame { return frequencies; }
209212
let mut code = Code(0);
210213

211214
// Pull first frame.
@@ -220,6 +223,7 @@ fn generate_frequencies(frequencies: &mut Table,
220223
frequencies.lookup(code, BumpCallback);
221224
input = input.slice_from(1);
222225
}
226+
frequencies
223227
}
224228

225229
fn print_frequencies(frequencies: &Table, frame: uint) {
@@ -266,20 +270,21 @@ fn main() {
266270
} else {
267271
get_sequence(&mut std::io::stdin(), ">THREE")
268272
};
269-
270-
let mut frequencies = Table::new();
271-
generate_frequencies(&mut frequencies, input.as_slice(), 1);
272-
print_frequencies(&frequencies, 1);
273-
274-
frequencies = Table::new();
275-
generate_frequencies(&mut frequencies, input.as_slice(), 2);
276-
print_frequencies(&frequencies, 2);
277-
278-
for occurrence in OCCURRENCES.iter() {
279-
frequencies = Table::new();
280-
generate_frequencies(&mut frequencies,
281-
input.as_slice(),
282-
occurrence.len());
283-
print_occurrences(&mut frequencies, *occurrence);
273+
let input = Arc::new(input);
274+
275+
let nb_freqs: Vec<(uint, Future<Table>)> = range(1u, 3).map(|i| {
276+
let input = input.clone();
277+
(i, Future::spawn(proc() generate_frequencies(input.as_slice(), i)))
278+
}).collect();
279+
let occ_freqs: Vec<Future<Table>> = OCCURRENCES.iter().map(|&occ| {
280+
let input = input.clone();
281+
Future::spawn(proc() generate_frequencies(input.as_slice(), occ.len()))
282+
}).collect();
283+
284+
for (i, freq) in nb_freqs.move_iter() {
285+
print_frequencies(&freq.unwrap(), i);
286+
}
287+
for (&occ, freq) in OCCURRENCES.iter().zip(occ_freqs.move_iter()) {
288+
print_occurrences(&mut freq.unwrap(), occ);
284289
}
285290
}

0 commit comments

Comments
 (0)