Skip to main content

strontium_core/
bench.rs

1use std::collections::VecDeque;
2use std::future::Future;
3use std::pin::Pin;
4
5use crate::scheduler::Scheduler;
6
7pub struct SchedulerBench {
8    scheduler: Scheduler,
9}
10
11impl Default for SchedulerBench {
12    fn default() -> Self {
13        Self::new()
14    }
15}
16
17impl SchedulerBench {
18    pub fn new() -> Self {
19        Self {
20            scheduler: Scheduler::new(),
21        }
22    }
23
24    pub fn fill_pending(&mut self, count: usize) {
25        self.scheduler.pending_new.clear();
26        for id in 0..count {
27            let fut: Pin<Box<dyn Future<Output = ()> + Send + 'static>> = Box::pin(async move {
28                let _ = id;
29            });
30            self.scheduler.pending_new.push((id, fut));
31        }
32    }
33
34    pub fn drain_pending_into_ready(&mut self) {
35        for (id, fut) in self.scheduler.pending_new.drain(..).collect::<Vec<_>>() {
36            self.scheduler.tasks.insert(id, fut);
37            self.scheduler.ready.push_back(id);
38        }
39    }
40
41    pub fn load_ready(&mut self, count: usize) {
42        self.scheduler.ready = (0..count).collect::<VecDeque<_>>();
43    }
44
45    pub fn churn_ready(&mut self, iterations: usize) {
46        for _ in 0..iterations {
47            if let Some(id) = self.scheduler.ready.pop_front() {
48                self.scheduler.ready.push_back(id);
49            }
50        }
51    }
52}