@@ -10,10 +10,12 @@ const LIGHT_TASKS: usize = 25_000;
10
10
11
11
static EX : Executor < ' _ > = Executor :: new ( ) ;
12
12
13
- fn run ( f : impl FnOnce ( ) ) {
13
+ fn run ( f : impl FnOnce ( ) , multithread : bool ) {
14
+ let limit = if multithread { num_cpus:: get ( ) } else { 1 } ;
15
+
14
16
let ( s, r) = async_channel:: bounded :: < ( ) > ( 1 ) ;
15
17
easy_parallel:: Parallel :: new ( )
16
- . each ( 0 ..num_cpus :: get ( ) , |_| future:: block_on ( EX . run ( r. recv ( ) ) ) )
18
+ . each ( 0 ..limit , |_| future:: block_on ( EX . run ( r. recv ( ) ) ) )
17
19
. finish ( move || {
18
20
let _s = s;
19
21
f ( )
@@ -30,94 +32,97 @@ fn create(c: &mut Criterion) {
30
32
} ) ;
31
33
}
32
34
33
- fn spawn_one ( c : & mut Criterion ) {
34
- c. bench_function ( "executor::spawn_one" , |b| {
35
- run ( || {
36
- b. iter ( || {
37
- future:: block_on ( async { EX . spawn ( async { } ) . await } ) ;
38
- } ) ;
35
+ fn running_benches ( c : & mut Criterion ) {
36
+ for ( group_name, multithread) in [ ( "single_thread" , false ) , ( "multi_thread" , true ) ] . iter ( ) {
37
+ let mut group = c. benchmark_group ( group_name. to_string ( ) ) ;
38
+
39
+ group. bench_function ( "executor::spawn_one" , |b| {
40
+ run (
41
+ || {
42
+ b. iter ( || {
43
+ future:: block_on ( async { EX . spawn ( async { } ) . await } ) ;
44
+ } ) ;
45
+ } ,
46
+ * multithread,
47
+ ) ;
39
48
} ) ;
40
- } ) ;
41
- }
42
49
43
- fn spawn_many ( c : & mut Criterion ) {
44
- c. bench_function ( "executor::spawn_many_local" , |b| {
45
- run ( || {
46
- b. iter ( move || {
47
- future:: block_on ( async {
48
- let mut tasks = Vec :: new ( ) ;
49
- for _ in 0 ..LIGHT_TASKS {
50
- tasks. push ( EX . spawn ( async { } ) ) ;
51
- }
52
- for task in tasks {
53
- task. await ;
54
- }
55
- } ) ;
56
- } ) ;
50
+ group. bench_function ( "executor::spawn_many_local" , |b| {
51
+ run (
52
+ || {
53
+ b. iter ( move || {
54
+ future:: block_on ( async {
55
+ let mut tasks = Vec :: new ( ) ;
56
+ for _ in 0 ..LIGHT_TASKS {
57
+ tasks. push ( EX . spawn ( async { } ) ) ;
58
+ }
59
+ for task in tasks {
60
+ task. await ;
61
+ }
62
+ } ) ;
63
+ } ) ;
64
+ } ,
65
+ * multithread,
66
+ ) ;
57
67
} ) ;
58
- } ) ;
59
- }
60
68
61
- fn spawn_recursively ( c : & mut Criterion ) {
62
- c . bench_function ( "executor::spawn_recursively" , |b| {
63
- # [ allow ( clippy :: manual_async_fn ) ]
64
- fn go ( i : usize ) -> impl Future < Output = ( ) > + Send + ' static {
65
- async move {
66
- if i != 0 {
67
- EX . spawn ( async move {
68
- let fut = go ( i - 1 ) . boxed ( ) ;
69
- fut . await ;
70
- } )
71
- . await ;
69
+ group . bench_function ( "executor::spawn_recursively" , |b| {
70
+ # [ allow ( clippy :: manual_async_fn ) ]
71
+ fn go ( i : usize ) -> impl Future < Output = ( ) > + Send + ' static {
72
+ async move {
73
+ if i != 0 {
74
+ EX . spawn ( async move {
75
+ let fut = go ( i - 1 ) . boxed ( ) ;
76
+ fut . await ;
77
+ } )
78
+ . await ;
79
+ }
72
80
}
73
81
}
74
- }
75
82
76
- run ( || {
77
- b. iter ( move || {
78
- future:: block_on ( async {
79
- let mut tasks = Vec :: new ( ) ;
80
- for _ in 0 ..TASKS {
81
- tasks. push ( EX . spawn ( go ( STEPS ) ) ) ;
82
- }
83
- for task in tasks {
84
- task. await ;
85
- }
86
- } ) ;
87
- } ) ;
83
+ run (
84
+ || {
85
+ b. iter ( move || {
86
+ future:: block_on ( async {
87
+ let mut tasks = Vec :: new ( ) ;
88
+ for _ in 0 ..TASKS {
89
+ tasks. push ( EX . spawn ( go ( STEPS ) ) ) ;
90
+ }
91
+ for task in tasks {
92
+ task. await ;
93
+ }
94
+ } ) ;
95
+ } ) ;
96
+ } ,
97
+ * multithread,
98
+ ) ;
88
99
} ) ;
89
- } ) ;
90
- }
91
100
92
- fn yield_now ( c : & mut Criterion ) {
93
- c. bench_function ( "executor::yield_now" , |b| {
94
- run ( || {
95
- b. iter ( move || {
96
- future:: block_on ( async {
97
- let mut tasks = Vec :: new ( ) ;
98
- for _ in 0 ..TASKS {
99
- tasks. push ( EX . spawn ( async move {
100
- for _ in 0 ..STEPS {
101
- future:: yield_now ( ) . await ;
101
+ group. bench_function ( "executor::yield_now" , |b| {
102
+ run (
103
+ || {
104
+ b. iter ( move || {
105
+ future:: block_on ( async {
106
+ let mut tasks = Vec :: new ( ) ;
107
+ for _ in 0 ..TASKS {
108
+ tasks. push ( EX . spawn ( async move {
109
+ for _ in 0 ..STEPS {
110
+ future:: yield_now ( ) . await ;
111
+ }
112
+ } ) ) ;
102
113
}
103
- } ) ) ;
104
- }
105
- for task in tasks {
106
- task. await ;
107
- }
108
- } ) ;
109
- } ) ;
114
+ for task in tasks {
115
+ task. await ;
116
+ }
117
+ } ) ;
118
+ } ) ;
119
+ } ,
120
+ * multithread,
121
+ ) ;
110
122
} ) ;
111
- } ) ;
123
+ }
112
124
}
113
125
114
- criterion_group ! (
115
- benches,
116
- create,
117
- spawn_one,
118
- spawn_many,
119
- spawn_recursively,
120
- yield_now,
121
- ) ;
126
+ criterion_group ! ( benches, create, running_benches) ;
122
127
123
128
criterion_main ! ( benches) ;
0 commit comments