Config API changes (src/preempt.rs, src/runtime.rs):
- preempt: promote ALLOC_INTERVAL and TIMESLICE_CYCLES from bare consts to
DEFAULT_ALLOC_INTERVAL / DEFAULT_TIMESLICE_CYCLES; store active values in
thread-locals set on each actor resume so multiple runtimes can use
different settings concurrently.
- runtime: add alloc_interval / timeslice_cycles fields to Config; add
Config::alloc_interval(n) and Config::timeslice_cycles(c) builder methods;
thread the values through RuntimeInner to the reset_timeslice() call in
schedule_loop.
Bench changes:
- Add bench_cfg(threads) helper to general/tokio_favored/smarm_favored that
wraps Config::exact and reads SMARM_ALLOC_INTERVAL / SMARM_TIMESLICE_CYCLES
env vars, so the sweep script can vary knobs without recompiling.
Sweep tooling (benches/sweep.py):
- 'run': run the 3-file bench suite once; --save-baseline persists JSON
- 'regress': compare current run against baseline.json, exit 1 on any bench
that regresses >10% vs stored medians
- 'sweep': run the full SWEEP_GRID (10 points), print comparison table,
optional --save-csv; binaries pre-built so no recompile per point
Sweep results (10-point grid, 1-CPU sandbox):
- The preemption knobs have very little effect on this single-CPU machine.
Most benches move <5% across the entire grid.
- Longer timeslices (tc=600k, tc=1200k) reliably hurt spawn_storm_busy
(+11-15%) and catch_unwind_panics (+10-12%) because actors hold the
scheduler mutex longer per timeslice, stalling the storm of joinable tasks.
- Shorter timeslices (tc=150k) give a small improvement on many_timers
(-3-4%) and a wash everywhere else.
- yield_in_hot_loop and uncontended_channel are essentially flat across all
knobs — both are scheduling-dominated and call yield_now explicitly, so
the RDTSC-driven preemption path is irrelevant.
- Conclusion: the knobs matter primarily under contention (multi-core).
Re-run sweep on a multi-core machine before drawing tuning conclusions.
127 lines
8.3 KiB
Plaintext
127 lines
8.3 KiB
Plaintext
smarm general benchmarks
|
||
available parallelism: 1 threads
|
||
ITERS=15 (+1 warmup, discarded)
|
||
CHAIN_DEPTH=1000, YIELD_TASKS=200×1000, PRIME_N=400000/64 workers, PP_ROUNDS=1000
|
||
|
||
================================================================================
|
||
chained_spawn: depth 1000
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 1000 | 8596 | 8491 | 8805
|
||
smarm 1-thread | 1000 | 8552 | 8461 | 9003
|
||
tokio current_thread | 1000 | 125 | 125 | 260
|
||
tokio multi-thread | 1000 | 190 | 184 | 338
|
||
|
||
================================================================================
|
||
yield_many: 200 tasks × 1000 yields
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 200000 | 41885 | 41112 | 43292
|
||
smarm 1-thread | 200000 | 42174 | 41063 | 43145
|
||
tokio current_thread | 200000 | 15195 | 15010 | 15589
|
||
tokio multi-thread | 200000 | 16037 | 15869 | 17057
|
||
|
||
================================================================================
|
||
fan_out_compute: primes in [2, 400000) across 64
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 33860 | 29872 | 29629 | 31596
|
||
smarm 1-thread | 33860 | 29776 | 29528 | 30003
|
||
tokio current_thread | 33860 | 28705 | 28605 | 30287
|
||
tokio multi-thread | 33860 | 34655 | 34503 | 36596
|
||
|
||
================================================================================
|
||
ping_pong_oneshot: 1000 rounds
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 1000 | 16898 | 16574 | 17386
|
||
smarm 1-thread | 1000 | 16871 | 16677 | 18467
|
||
tokio current_thread | 1000 | 897 | 857 | 991
|
||
tokio multi-thread | 1000 | 4325 | 4228 | 4458
|
||
smarm tokio-favored benchmarks
|
||
available parallelism: 1 threads
|
||
ITERS=15 (+1 warmup, discarded)
|
||
STORM_BACKGROUND=8, STORM_SPAWN=10000, MPSC=32×10000, TIMER_ACTORS=10000 (1–10 ms), SCALING_N=400000/64
|
||
|
||
================================================================================
|
||
spawn_storm_busy: 8 bg yielders + 10000 zero-work spawns
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 10000 | 133462 | 129526 | 138685
|
||
smarm 1-thread | 10000 | 130118 | 127633 | 142344
|
||
tokio current_thread | 10000 | 2713 | 2608 | 2831
|
||
tokio multi-thread | 10000 | 7367 | 4345 | 11741
|
||
|
||
================================================================================
|
||
mpsc_contention: 32 producers × 10000 msgs → 1 consumer
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 320000 | 9077 | 8944 | 9287
|
||
smarm 1-thread | 320000 | 9100 | 9033 | 10604
|
||
tokio current_thread | 320000 | 17310 | 17122 | 18616
|
||
tokio multi-thread | 320000 | 17484 | 17413 | 17748
|
||
|
||
================================================================================
|
||
many_timers: 10000 actors sleeping 1–10 ms
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 10000 | 140039 | 135577 | 145123
|
||
smarm 1-thread | 10000 | 139931 | 135513 | 143841
|
||
tokio current_thread | 10000 | 14524 | 14378 | 14564
|
||
tokio multi-thread | 10000 | 15066 | 14677 | 15336
|
||
|
||
================================================================================
|
||
multi_thread_scaling: primes in [2, 400000) across 64 workers
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 33860 | 29620 | 29511 | 31347
|
||
tokio multi 1-thread | 33860 | 29046 | 28817 | 29687
|
||
smarm smarm-favored benchmarks
|
||
available parallelism: 1 threads
|
||
ITERS=15 (+1 warmup, discarded)
|
||
RECURSE_DEPTH=500, HOT_YIELDS=500000×2, UNCONT_MSGS=1000000, PANIC_TASKS=10000
|
||
|
||
================================================================================
|
||
deep_recursion: depth 500
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 1 | 94 | 79 | 371
|
||
smarm 1-thread | 1 | 183 | 83 | 317
|
||
tokio current_thread | 1 | 25 | 25 | 31
|
||
tokio multi-thread | 1 | 54 | 41 | 71
|
||
|
||
================================================================================
|
||
yield_in_hot_loop: 2 actors × 500000 yields (single thread)
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 1000000 | 189034 | 187674 | 192204
|
||
tokio current_thread | 1000000 | 151106 | 149564 | 155601
|
||
|
||
================================================================================
|
||
uncontended_channel: 1→1, 1000000 msgs (single thread)
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 1000000 | 26949 | 26838 | 30868
|
||
tokio current_thread | 1000000 | 52984 | 52149 | 55141
|
||
|
||
================================================================================
|
||
catch_unwind_panics: 10000 tasks, 50% panic
|
||
================================================================================
|
||
runtime | result | median µs | min µs | max µs
|
||
--------------------------------------------------------------------------------
|
||
smarm 1-thread | 10000 | 145860 | 143015 | 152734
|
||
smarm 1-thread | 10000 | 144550 | 141592 | 149247
|
||
tokio current_thread | 10000 | 267500 | 265301 | 278751
|
||
tokio multi-thread | 10000 | 275320 | 268986 | 286891
|