From 8d7dfa44b0b4d4d233e714a291aead8c34543178 Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 2 Aug 2012 00:07:12 -0400 Subject: [PATCH] Linked failure: Add '100 generations' bench test (#1868) --- .../bench/task-perf-jargon-metal-smoke.rs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/test/bench/task-perf-jargon-metal-smoke.rs diff --git a/src/test/bench/task-perf-jargon-metal-smoke.rs b/src/test/bench/task-perf-jargon-metal-smoke.rs new file mode 100644 index 000000000000..c2e25c5e5e33 --- /dev/null +++ b/src/test/bench/task-perf-jargon-metal-smoke.rs @@ -0,0 +1,32 @@ +// Test performance of a task "spawn ladder", in which children task have many +// many ancestor taskgroups, but with only a few such groups alive at a time. +// Each child task has to enlist as a descendant in each of its ancestor +// groups, but that shouldn't have to happen for already-dead groups. +// +// The filename is a reference; google it in quotes. + +fn child_generation(gens_left: uint) { + // This used to be O(n^2) in the number of generations that ever existed. + // With this code, only as many generations are alive at a time as tasks + // alive at a time, + do task::spawn_supervised { + if gens_left & 1 == 1 { + task::yield(); // shake things up a bit + } + if gens_left > 0 { + child_generation(gens_left - 1); // recurse + } + } +} + +fn main(args: ~[~str]) { + let args = if os::getenv(~"RUST_BENCH").is_some() { + ~[~"", ~"100000"] + } else if args.len() <= 1u { + ~[~"", ~"100"] + } else { + copy args + }; + + child_generation(uint::from_str(args[1]).get()); +}