summaryrefslogtreecommitdiffstats
path: root/benches/spawn.rs
blob: 72a4035757ac557be2b60504019a93464df58beb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! Benchmark spawning a task onto the basic and threaded Tokio executors.
//! This essentially measure the time to enqueue a task in the local and remote
//! case.

use bencher::{black_box, Bencher};

async fn work() -> usize {
    let val = 1 + 1;
    black_box(val)
}

fn basic_scheduler_local_spawn(bench: &mut Bencher) {
    let runtime = tokio::runtime::Builder::new_current_thread()
        .build()
        .unwrap();
    runtime.block_on(async {
        bench.iter(|| {
            let h = tokio::spawn(work());
            black_box(h);
        })
    });
}

fn threaded_scheduler_local_spawn(bench: &mut Bencher) {
    let runtime = tokio::runtime::Builder::new_current_thread()
        .build()
        .unwrap();
    runtime.block_on(async {
        bench.iter(|| {
            let h = tokio::spawn(work());
            black_box(h);
        })
    });
}

fn basic_scheduler_remote_spawn(bench: &mut Bencher) {
    let runtime = tokio::runtime::Builder::new_current_thread()
        .build()
        .unwrap();

    bench.iter(|| {
        let h = runtime.spawn(work());
        black_box(h);
    });
}

fn threaded_scheduler_remote_spawn(bench: &mut Bencher) {
    let runtime = tokio::runtime::Builder::new_multi_thread().build().unwrap();

    bench.iter(|| {
        let h = runtime.spawn(work());
        black_box(h);
    });
}

bencher::benchmark_group!(
    spawn,
    basic_scheduler_local_spawn,
    threaded_scheduler_local_spawn,
    basic_scheduler_remote_spawn,
    threaded_scheduler_remote_spawn
);

bencher::benchmark_main!(spawn);