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