]> git.lizzy.rs Git - rust.git/commit
auto merge of #8317 : bblum/rust/fast-spawn-unlinked, r=brson
authorbors <bors@rust-lang.org>
Tue, 6 Aug 2013 17:32:00 +0000 (10:32 -0700)
committerbors <bors@rust-lang.org>
Tue, 6 Aug 2013 17:32:00 +0000 (10:32 -0700)
commit72080954b9deb3a6a5f793d2fd1ef32c3d5acb5d
tree456eb7e1919d304b7630dd7d89b5bd9b98a1a1ad
parent3dfb55ab09a8533da7c5bf559c923685d5d64dc1
parent1f95bd768444a4a0318951c2e76f3d28bbf3763a
auto merge of #8317 : bblum/rust/fast-spawn-unlinked, r=brson

This lazily initializes the taskgroup structs for ```spawn_unlinked``` tasks. If such a task never spawns another task linked to it (or a descendant of it), its taskgroup is simply never initialized at all. Also if an unlinked task spawns another unlinked task, neither of them will need to initialize their taskgroups. This works for the main task too.

I benchmarked this with the following test case and observed a ~~21% speedup (average over 4 runs: 7.85 sec -> 6.20 sec, 2.5 GHz)~~ 11% speedup, see comment below.
```
use std::task;
use std::cell::Cell;
use std::rt::comm;

static NUM: uint = 1024*256;

fn run(f: ~fn()) {
    let mut t = task::task();
    t.unlinked();
    t.spawn(f);
}

fn main() {
    do NUM.times {
        let (p,c) = comm::oneshot();
        let c = Cell::new(c);
        do run { c.take().send(()); }
        p.recv();
    }
}
```