Skip to content

Commit bdddf57

Browse files
committed
---
yaml --- r: 22439 b: refs/heads/master c: a00478b h: refs/heads/master i: 22437: ee819f1 22435: 485164a 22431: 5ba42b4 v: v3
1 parent d114a5d commit bdddf57

File tree

2 files changed

+53
-12
lines changed

2 files changed

+53
-12
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: e51f259ff02b566ed5ca55b0fe76bd452fbf0400
2+
refs/heads/master: a00478b7c9433e8f50f9818ce9b2d8f26d4eabdd
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: cd6f24f9d14ac90d167386a56e7a6ac1f0318195
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be

trunk/src/test/bench/task-perf-word-count-generic.rs

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ import comm::recv;
3030
import comm::send;
3131
import comm::methods;
3232

33+
trait word_reader {
34+
fn read_word() -> option<str>;
35+
}
36+
3337
// These used to be in task, but they disappeard.
3438
type joinable_task = port<()>;
3539
fn spawn_joinable(+f: fn~()) -> joinable_task {
@@ -46,14 +50,21 @@ fn join(t: joinable_task) {
4650
t.recv()
4751
}
4852

49-
fn map(&&filename: str, emit: map_reduce::putter<str, int>) {
50-
let f = alt io::file_reader(filename) {
51-
result::ok(f) { f }
53+
impl of word_reader for io::reader {
54+
fn read_word() -> option<str> { read_word(self) }
55+
}
56+
57+
fn file_word_reader(filename: str) -> word_reader {
58+
alt io::file_reader(filename) {
59+
result::ok(f) { f as word_reader }
5260
result::err(e) { fail #fmt("%?", e) }
53-
};
61+
}
62+
}
5463

64+
fn map(f: fn~() -> word_reader, emit: map_reduce::putter<str, int>) {
65+
let f = f();
5566
loop {
56-
alt read_word(f) {
67+
alt f.read_word() {
5768
some(w) { emit(w, 1); }
5869
none { break; }
5970
}
@@ -230,20 +241,31 @@ mod map_reduce {
230241
}
231242

232243
fn main(argv: ~[str]) {
233-
if vec::len(argv) < 2u {
244+
if vec::len(argv) < 2u && !os::getenv("RUST_BENCH").is_some() {
234245
let out = io::stdout();
235246

236247
out.write_line(#fmt["Usage: %s <filename> ...", argv[0]]);
237248

238-
// FIXME (#2815): run something just to make sure the code hasn't
239-
// broken yet. This is the unit test mode of this program.
240-
241249
ret;
242250
}
243251

252+
let readers: ~[fn~() -> word_reader] = if argv.len() >= 2 {
253+
vec::view(argv, 1u, argv.len()).map(
254+
|f| fn~() -> word_reader { file_word_reader(f) } )
255+
}
256+
else {
257+
let num_readers = 50;
258+
let words_per_reader = 400;
259+
vec::from_fn(
260+
num_readers,
261+
|_i| fn~() -> word_reader {
262+
random_word_reader(words_per_reader) as word_reader
263+
})
264+
};
265+
244266
let start = time::precise_time_ns();
245267

246-
map_reduce::map_reduce(map, reduce, vec::slice(argv, 1u, argv.len()));
268+
map_reduce::map_reduce(map, reduce, readers);
247269
let stop = time::precise_time_ns();
248270

249271
let elapsed = (stop - start) / 1000000u64;
@@ -264,5 +286,24 @@ fn read_word(r: io::reader) -> option<str> {
264286
}
265287
ret none;
266288
}
289+
267290
fn is_word_char(c: char) -> bool {
268-
char::is_alphabetic(c) || char::is_digit(c) || c == '_' }
291+
char::is_alphabetic(c) || char::is_digit(c) || c == '_'
292+
}
293+
294+
class random_word_reader: word_reader {
295+
let mut remaining: uint;
296+
let rng: rand::rng;
297+
new(count: uint) {
298+
self.remaining = count;
299+
self.rng = rand::rng();
300+
}
301+
302+
fn read_word() -> option<str> {
303+
if self.remaining > 0 {
304+
self.remaining -= 1;
305+
some(self.rng.gen_str(5))
306+
}
307+
else { none }
308+
}
309+
}

0 commit comments

Comments
 (0)