1cac7dca0Sopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd.
2cac7dca0Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3cac7dca0Sopenharmony_ci// you may not use this file except in compliance with the License.
4cac7dca0Sopenharmony_ci// You may obtain a copy of the License at
5cac7dca0Sopenharmony_ci//
6cac7dca0Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7cac7dca0Sopenharmony_ci//
8cac7dca0Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9cac7dca0Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10cac7dca0Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11cac7dca0Sopenharmony_ci// See the License for the specific language governing permissions and
12cac7dca0Sopenharmony_ci// limitations under the License.
13cac7dca0Sopenharmony_ci
14cac7dca0Sopenharmony_ci//! Benchmarks for task scheduling.
15cac7dca0Sopenharmony_ci
16cac7dca0Sopenharmony_ci#![feature(test)]
17cac7dca0Sopenharmony_ci
18cac7dca0Sopenharmony_cimod task_helpers;
19cac7dca0Sopenharmony_ci
20cac7dca0Sopenharmony_ci#[macro_export]
21cac7dca0Sopenharmony_cimacro_rules! tokio_schedule_task {
22cac7dca0Sopenharmony_ci    ($runtime: expr, $bench: ident, $num: literal, $upper: literal) => {
23cac7dca0Sopenharmony_ci        #[bench]
24cac7dca0Sopenharmony_ci        fn $bench(b: &mut Bencher) {
25cac7dca0Sopenharmony_ci            let runtime = $runtime;
26cac7dca0Sopenharmony_ci            b.iter(black_box(|| {
27cac7dca0Sopenharmony_ci                let mut handlers = Vec::with_capacity($num);
28cac7dca0Sopenharmony_ci                for _ in 0..$num {
29cac7dca0Sopenharmony_ci                    handlers.push(runtime.spawn(async move {
30cac7dca0Sopenharmony_ci                        fibbo($upper);
31cac7dca0Sopenharmony_ci                        yield_now().await;
32cac7dca0Sopenharmony_ci                    }));
33cac7dca0Sopenharmony_ci                }
34cac7dca0Sopenharmony_ci
35cac7dca0Sopenharmony_ci                for handler in handlers {
36cac7dca0Sopenharmony_ci                    let _ = runtime.block_on(handler).unwrap();
37cac7dca0Sopenharmony_ci                }
38cac7dca0Sopenharmony_ci            }));
39cac7dca0Sopenharmony_ci        }
40cac7dca0Sopenharmony_ci    };
41cac7dca0Sopenharmony_ci}
42cac7dca0Sopenharmony_ci
43cac7dca0Sopenharmony_ci#[macro_export]
44cac7dca0Sopenharmony_cimacro_rules! ylong_schedule_task {
45cac7dca0Sopenharmony_ci    ($bench: ident, $num: literal, $upper: literal) => {
46cac7dca0Sopenharmony_ci        #[bench]
47cac7dca0Sopenharmony_ci        fn $bench(b: &mut Bencher) {
48cac7dca0Sopenharmony_ci            b.iter(black_box(|| {
49cac7dca0Sopenharmony_ci                let mut handlers = Vec::with_capacity($num);
50cac7dca0Sopenharmony_ci                for _ in 0..$num {
51cac7dca0Sopenharmony_ci                    handlers.push(ylong_runtime::spawn(async move {
52cac7dca0Sopenharmony_ci                        fibbo($upper);
53cac7dca0Sopenharmony_ci                        yield_now().await;
54cac7dca0Sopenharmony_ci                    }));
55cac7dca0Sopenharmony_ci                }
56cac7dca0Sopenharmony_ci
57cac7dca0Sopenharmony_ci                for handler in handlers {
58cac7dca0Sopenharmony_ci                    let _ = ylong_runtime::block_on(handler).unwrap();
59cac7dca0Sopenharmony_ci                }
60cac7dca0Sopenharmony_ci            }));
61cac7dca0Sopenharmony_ci        }
62cac7dca0Sopenharmony_ci    };
63cac7dca0Sopenharmony_ci}
64cac7dca0Sopenharmony_ci
65cac7dca0Sopenharmony_ci#[cfg(test)]
66cac7dca0Sopenharmony_cimod tokio_schedule_bench {
67cac7dca0Sopenharmony_ci    extern crate test;
68cac7dca0Sopenharmony_ci
69cac7dca0Sopenharmony_ci    use std::hint::black_box;
70cac7dca0Sopenharmony_ci
71cac7dca0Sopenharmony_ci    use test::Bencher;
72cac7dca0Sopenharmony_ci    use ylong_runtime::task::yield_now;
73cac7dca0Sopenharmony_ci
74cac7dca0Sopenharmony_ci    pub use crate::task_helpers::{fibbo, tokio_runtime};
75cac7dca0Sopenharmony_ci
76cac7dca0Sopenharmony_ci    tokio_schedule_task!(tokio_runtime(), tokio_task_10_15, 10, 15);
77cac7dca0Sopenharmony_ci    tokio_schedule_task!(tokio_runtime(), tokio_task_120_15, 120, 15);
78cac7dca0Sopenharmony_ci    tokio_schedule_task!(tokio_runtime(), tokio_task_10_30, 10, 30);
79cac7dca0Sopenharmony_ci    tokio_schedule_task!(tokio_runtime(), tokio_task_120_30, 120, 30);
80cac7dca0Sopenharmony_ci}
81cac7dca0Sopenharmony_ci
82cac7dca0Sopenharmony_ci#[cfg(test)]
83cac7dca0Sopenharmony_cimod ylong_schedule_bench {
84cac7dca0Sopenharmony_ci    extern crate test;
85cac7dca0Sopenharmony_ci
86cac7dca0Sopenharmony_ci    use std::hint::black_box;
87cac7dca0Sopenharmony_ci
88cac7dca0Sopenharmony_ci    use test::Bencher;
89cac7dca0Sopenharmony_ci    use ylong_runtime::task::yield_now;
90cac7dca0Sopenharmony_ci
91cac7dca0Sopenharmony_ci    pub use crate::task_helpers::fibbo;
92cac7dca0Sopenharmony_ci
93cac7dca0Sopenharmony_ci    ylong_schedule_task!(ylong_task_10_15, 10, 15);
94cac7dca0Sopenharmony_ci    ylong_schedule_task!(ylong_task_120_15, 120, 15);
95cac7dca0Sopenharmony_ci    ylong_schedule_task!(ylong_task_10_30, 10, 30);
96cac7dca0Sopenharmony_ci    ylong_schedule_task!(ylong_task_120_30, 120, 30);
97cac7dca0Sopenharmony_ci}
98