///|
fn main {
let scheduler = @wheel.Wheel::new()
let timer_count = 10000
let horizon = 4096
let mut index = 0
while index < timer_count {
let deadline = index * 37 % horizon + 1
ignore(
scheduler.schedule(@wheel.TimerSpec::once(deadline, "benchmark-payload")),
)
index = index + 1
}
let fired = match scheduler.advance_to(horizon) {
@wheel.AdvanceResult::Advanced(report) => report.fired.length()
@wheel.AdvanceResult::Rejected(_) => -1
}
println(
"scheduled=\{timer_count} fired=\{fired} pending=\{scheduler.pending()} horizon=\{horizon}",
)
println("stats=" + scheduler.stats().to_json())
println("validation_issues=\{scheduler.validate().length()}")
let storm = @wheel.Wheel::new()
for index = 0; index < timer_count; index = index + 1 {
ignore(storm.schedule(@wheel.TimerSpec::once(10, "storm-\{index}")))
}
let mut batches = 0
let mut drained = 0
let mut deferred = timer_count
while deferred > 0 {
match storm.advance_late_budgeted(1000, 256) {
@wheel.DrainResult::Drained(report) => {
batches = batches + 1
drained = drained + report.fired.length()
deferred = report.deferred_due
}
@wheel.DrainResult::Rejected(_) => break
}
}
println("storm_scheduled=\{timer_count}")
println("storm_budget=256")
println("storm_batches=\{batches}")
println("storm_drained=\{drained}")
println("storm_deferred=\{deferred}")
println("storm_validation_issues=\{storm.validate().length()}")
}