Skip to content

feat: optimized async-runtime (replace for gstd)#1090

Open
vobradovich wants to merge 83 commits into
masterfrom
vo/async-runtime
Open

feat: optimized async-runtime (replace for gstd)#1090
vobradovich wants to merge 83 commits into
masterfrom
vo/async-runtime

Conversation

@vobradovich

@vobradovich vobradovich commented Oct 16, 2025

Copy link
Copy Markdown
Member

Summary

  • Reduce number of hashmaps to 2
  • Task now tracks the user future, pending reply locks, and (non-ethexe) critical hooks, letting message_loop reuse locks and enforce timeouts.
  • Added WakeSignals to manage reply lifecycle states—Pending, Ready, Timeout—so record_reply, poll, and timeout propagation share one typed registry, including optional reply hooks and automatic wake/cleanup
  • Refined Lock to store deadline and wait type

Sails async_runtime vs the async runtime in gstd

Sails reimplements the on-chain async loop, collapsing gstd's four global maps into
two, moving per-message state into the structures it belongs to (wait locks into the
Task, reply hooks into the WakeSignal), swapping the hasher, dropping waker machinery, and
adding a first-class timeout/expiry lifecycle with RAII cleanup. Same actor / wait /
wake model underneath; leaner bookkeeping and more explicit edge-case handling on top.

Global state: 4 maps -> 2

Concern gstd Sails
Futures FUTURES: HashMap<MessageId, Task> tasks: IdMap<Task>
Reply signals SIGNALS: HashMap<MessageId, WakeSignal> signals: IdMap<WakeSignal>
Wait locks LOCKS: HashMap<MessageId, BTreeMap<LockContext, Lock>> folded into Task.locks
Reply hooks REPLY_HOOKS: HashMap<MessageId, Box<dyn FnOnce()>> folded into WakeSignal::{Pending,Expired}.reply_hook

gstd does 2-3 independent keyed map operations per send and touches all four maps on teardown.
Sails registers a wait with one signals insert plus one push into the owning task's heap, and
a hook rides inside the signal it belongs to — fewer hash lookups and no cross-map lifetime
coordination.

Hashing

  • gstd: hashbrown default hasher — mixes all 32 bytes of every MessageId.
  • Sails: IdMap = HashMap<.., BuildHasherDefault<IdHasher>>. MessageId is already a
    cryptographic hash, so IdHasher takes its first 8 bytes verbatim. No mixing -> cheaper gas on
    every map op.

Lock storage & "shortest wait" selection

  • gstd: nested HashMap<MessageId, BTreeMap<LockContext, Lock>>. LockContext is an enum —
    ReplyTo, Sleep, MxLockMonitor (the last serves gstd's Mutex/RwLock). On wait() it
    iterates the inner map, filters deadline > now, and min_by. Lock::cmp compares deadline
    only.
  • Sails: Task.locks: BinaryHeap<(Reverse<Lock>, Option<MessageId>)>. Earliest deadline is
    the heap root; next_lock peeks/pops, lazily dropping locks that expired or whose signal is no
    longer waited-for. Some(reply_to) = reply wait, None = sleep. No MxLockMonitor variant
    (Sails doesn't ship gstd's mutexes). Its Lock::cmp breaks deadline ties UpTo < Exactly
    (UpTo wins) — deterministic, where gstd leaves ties unordered.

Reply lifecycle & timeout semantics (the biggest behavioral difference)

  • gstd WakeSignal is a struct: { message_id, payload: Option<(Payload, ReplyCode)>, waker: Option<Waker> } — effectively two states (pending / has-payload). Timeout is not part of the
    signal
    ; it's computed externally in msg::async::poll via locks().is_timeout(...), and on
    timeout the lock and signal entry are removed eagerly. Polling a missing entry panics.

  • Sails WakeSignal is a 3-variant enum: Pending { message_id, deadline, reply_hook } ->
    Ready { payload, reply_code } | Expired { expected, now, reply_hook }. Timeout is a
    first-class, retained state.
    Expired entries are deliberately kept so that:

    • a deferred re-poll (e.g. select!/join! where another branch finished first and the
      MessageFuture is polled late) observes Err(Timeout) instead of panicking on a missing
      entry;
    • a late reply can still fire a preserved reply_hook via record_reply;
    • final deletion is MessageFuture::drop's job (RAII), not poll's.

    The expire() transition is shared by record_timeout (natural timeout), poll (deferred
    timeout), and forget_future (cancellation), and drop/cancel is symmetric with timeout
    (Pending+hook -> Expired+hook). gstd has none of this retain/RAII machinery — it's covered in
    Sails by a dedicated test matrix.

Wakers

  • gstd: real waker plumbing — Task holds a waker_fn, each pending poll clones
    cx.waker() into the signal, and record_reply calls both waker.wake_by_ref() and
    exec::wake.
  • Sails: Context::from_waker(Waker::noop()) — no waker stored or cloned, ever. Re-entry is
    driven solely by Syscall::wake(message_id). Valid because the loop drives exactly one future
    per message and never needs intra-future notification; saves the per-poll waker clone.

Reply hooks

  • gstd: separate HooksMap; register panics on duplicate; executed in
    handle_reply_with_hook after record_reply, removed in handle_signal. Decoupled from the
    signal.
  • Sails: the hook lives inside the signal (Pending/Expired), so it travels through the
    state transitions — the "late reply still fires the hook" and "cancellation preserves the hook"
    behaviors fall out for free. One fewer map and lookup. send_one_way adds register_hook,
    which stores an Expired-with-hook entry so fire-and-forget sends can still fire a hook from
    outside message_loop.

Critical hooks

  • gstd: separate critical module (take_and_execute/take_hook) as global state; the loop
    clears it on completion, handle_signal runs it.
  • Sails: critical_hook: Option<Box<dyn FnOnce(MessageId)>> is a Task field, set via
    with_task_mut, taken from the removed task in handle_signal. No separate global; compiled
    out under ethexe.

message_loop & the reentrancy/aliasing fix

  • gstd: holds &mut task and polls Pin::new(&mut task.future) while that borrow (and the
    &mut FUTURES borrow) is live. Safe for gstd because wait/lock/hook registration goes through
    different maps, never re-borrowing FUTURES during the poll. It also carries a
    lock_exceeded flag, checked at loop entry, to panic on lock-ownership-time overrun.
  • Sails: because locks now live in the Task, registering a wait during a poll
    (register_signal -> task.insert_lock) would re-borrow the tasks map while the future is
    being polled. Sails fixes this structurally: Task.future is Option<...>, moved out with
    .take() before polling (so the &mut Task borrow ends), and every reentrant access
    (register_signal, set_critical_hook, sleep_for) goes through a short-lived
    with_task_mut. Result: sound under Stacked/Tree Borrows, no Box-noalias hazard, no unsafe
    — validated by a Miri test. There's no lock_exceeded flag; overrun relies on node-side
    timeout plus the Expired transitions.

Sleep

  • gstd: LocksMap::insert_sleep/remove_sleep, keyed by wake-up block in the nested
    BTreeMap under a Sleep context.
  • Sails: sleep_for pushes an unkeyed (reply_to = None) lock into the task heap and returns
    a MessageSleepFuture that resolves when block_height >= deadline. No separate sleep context.

Smaller but real

  • No Send bound on reply hooks (FnOnce() + 'static) — matches gstd's hook type; the client
    GstdParams::with_reply_hook dropped its old Send requirement to suit.
  • entry_ref/EntryRef API used in record_reply/forget_future/poll to avoid double
    lookups.
  • No mutex/async_init/async_main — Sails serves fewer clients than gstd's runtime (it
    generates its own ctor/dispatch via macros), which is why its lock model can be leaner.
  • Host-testable: routes through the Syscall abstraction
    (with_message_id/with_block_height/with_reply_code mocks), giving the whole runtime
    host-side unit tests plus Miri — gstd's runtime is largely on-chain-tested only.

Net trade-offs

Sails gains: fewer maps/lookups and a faster hasher (gas), explicit and tested
timeout/cancellation/late-reply semantics, no waker allocation, and unit/Miri testability.

Sails takes on: a subtle reentrancy invariant (future-out-of-Task during poll) that gstd
sidesteps by construction, and re-implements lock/signal/hook bookkeeping that it must keep
correct itself rather than inheriting from gstd.

@vobradovich
vobradovich requested a review from techraed October 20, 2025 12:06
@vobradovich vobradovich changed the title feat: optimezed async-runtime (replace for gstd) feat: optimized async-runtime (replace for gstd) Oct 21, 2025
@github-actions

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 450_513_679_484 450_514_036_959 -357_475 -0.00%
alloc-0 563_780_574 564_376_739 -596_165 -0.11%
alloc-12 567_287_166 567_864_696 -577_530 -0.10%
alloc-143 726_655_761 727_298_127 -642_366 -0.09%
alloc-986 827_641_528 828_290_311 -648_783 -0.08%
alloc-10945 2_018_406_054 2_019_067_671 -661_617 -0.03%
alloc-46367 6_403_667_537 6_404_351_520 -683_983 -0.01%
alloc-121392 16_858_359_295 16_859_084_038 -724_743 -0.00%
alloc-317810 43_146_678_632 43_147_409_792 -731_160 -0.00%
counter_sync 637_172_916 678_859_589 -41_686_673 -6.14% 🚀
counter_async 803_743_595 851_480_134 -47_736_539 -5.61% 🚀
cross_program 2_238_138_550 2_436_719_419 -198_580_869 -8.15% 🚀
redirect 3_194_681_197 3_474_613_683 -279_932_486 -8.06% 🚀
stack_0 700_149_834 799_115_685 -98_965_851 -12.38% 🚀
stack_1 3_361_996_318 3_769_584_063 -407_587_745 -10.81% 🚀
stack_5 14_040_202_619 15_693_086_906 -1_652_884_287 -10.53% 🚀
stack_10 26_229_111_691 29_592_077_575 -3_362_965_884 -11.36% 🚀
stack_20 51_819_675_943 63_989_367_411 -12_169_691_468 -19.02% 🚀

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at aeaccca.

@github-actions

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 450_513_679_484 450_514_036_959 -357_475 -0.00%
alloc-0 563_780_574 564_376_739 -596_165 -0.11%
alloc-12 567_287_166 567_864_696 -577_530 -0.10%
alloc-143 726_655_761 727_298_127 -642_366 -0.09%
alloc-986 827_641_528 828_290_311 -648_783 -0.08%
alloc-10945 2_018_406_054 2_019_067_671 -661_617 -0.03%
alloc-46367 6_403_667_537 6_404_351_520 -683_983 -0.01%
alloc-121392 16_858_359_295 16_859_084_038 -724_743 -0.00%
alloc-317810 43_146_678_632 43_147_409_792 -731_160 -0.00%
counter_sync 637_172_916 678_859_589 -41_686_673 -6.14% 🚀
counter_async 803_743_595 851_480_134 -47_736_539 -5.61% 🚀
cross_program 2_238_936_989 2_436_719_419 -197_782_430 -8.12% 🚀
redirect 3_194_681_197 3_474_613_683 -279_932_486 -8.06% 🚀
stack_0 700_149_834 799_115_685 -98_965_851 -12.38% 🚀
stack_1 3_361_996_318 3_769_584_063 -407_587_745 -10.81% 🚀
stack_5 14_040_202_619 15_693_086_906 -1_652_884_287 -10.53% 🚀
stack_10 26_229_111_691 29_592_077_575 -3_362_965_884 -11.36% 🚀
stack_20 51_819_675_943 63_989_367_411 -12_169_691_468 -19.02% 🚀

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at 5413c5a.

@github-actions

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_523_553_267 465_521_292_356 +2_260_911 +0.00%
alloc-0 598_194_209 596_089_512 +2_104_697 +0.35%
alloc-12 601_635_117 599_460_876 +2_174_241 +0.36%
alloc-143 761_411_968 759_364_306 +2_047_662 +0.27%
alloc-986 864_097_354 862_362_378 +1_734_976 +0.20%
alloc-10945 2_214_636_039 2_216_616_777 -1_980_738 -0.09%
alloc-46367 6_544_099_901 6_541_997_330 +2_102_571 +0.03%
alloc-121392 17_170_526_475 17_168_433_902 +2_092_573 +0.01%
alloc-317810 43_907_840_502 43_905_750_055 +2_090_447 +0.00%
counter_sync 665_785_492 693_006_121 -27_220_629 -3.93% 👍
counter_async 829_606_982 863_104_002 -33_497_020 -3.88% 👍
cross_program 2_215_441_187 2_397_009_996 -181_568_809 -7.57% 🚀
redirect 3_197_138_740 3_471_987_506 -274_848_766 -7.92% 🚀
stack_0 705_592_615 799_415_299 -93_822_684 -11.74% 🚀
stack_1 3_392_136_301 3_778_945_524 -386_809_223 -10.24% 🚀
stack_5 14_168_220_708 15_738_223_846 -1_570_003_138 -9.98% 🚀
stack_10 26_478_961_103 29_542_694_740 -3_063_733_637 -10.37% 🚀
stack_20 54_514_692_122 66_032_420_478 -11_517_728_356 -17.44% 🚀

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at 897832b.

@github-actions

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_525_935_187 465_521_292_356 +4_642_831 +0.00%
alloc-0 600_689_965 596_089_512 +4_600_453 +0.77%
alloc-12 604_170_814 599_460_876 +4_709_938 +0.79%
alloc-143 763_943_813 759_364_306 +4_579_507 +0.60%
alloc-986 866_629_199 862_362_378 +4_266_821 +0.49%
alloc-10945 2_217_167_884 2_216_616_777 +551_107 +0.02%
alloc-46367 6_546_631_746 6_541_997_330 +4_634_416 +0.07%
alloc-121392 17_173_094_409 17_168_433_902 +4_660_507 +0.03%
alloc-317810 43_910_408_436 43_905_750_055 +4_658_381 +0.01%
counter_sync 667_803_711 693_006_121 -25_202_410 -3.64% 👍
counter_async 831_625_201 863_104_002 -31_478_801 -3.65% 👍
cross_program 2_218_461_812 2_397_009_996 -178_548_184 -7.45% 🚀
redirect 3_199_897_684 3_471_987_506 -272_089_822 -7.84% 🚀
stack_0 705_318_790 799_415_299 -94_096_509 -11.77% 🚀
stack_1 3_391_069_123 3_778_945_524 -387_876_401 -10.26% 🚀
stack_5 14_163_980_118 15_738_223_846 -1_574_243_728 -10.00% 🚀
stack_10 26_470_753_748 29_542_694_740 -3_071_940_992 -10.40% 🚀
stack_20 54_498_551_237 66_032_420_478 -11_533_869_241 -17.47% 🚀

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at d1e81d4.

@github-actions

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_523_945_542 465_521_292_356 +2_653_186 +0.00%
alloc-0 598_700_320 596_089_512 +2_610_808 +0.44%
alloc-12 602_141_228 599_460_876 +2_680_352 +0.45%
alloc-143 761_918_079 759_364_306 +2_553_773 +0.34%
alloc-986 864_603_465 862_362_378 +2_241_087 +0.26%
alloc-10945 2_215_142_150 2_216_616_777 -1_474_627 -0.07%
alloc-46367 6_544_606_012 6_541_997_330 +2_608_682 +0.04%
alloc-121392 17_171_032_586 17_168_433_902 +2_598_684 +0.02%
alloc-317810 43_908_346_613 43_905_750_055 +2_596_558 +0.01%
counter_sync 653_485_763 693_006_121 -39_520_358 -5.70% 🚀
counter_async 818_743_175 863_104_002 -44_360_827 -5.14% 🚀
cross_program 2_198_786_808 2_397_009_996 -198_223_188 -8.27% 🚀
redirect 3_182_922_366 3_471_987_506 -289_065_140 -8.33% 🚀
stack_0 696_996_324 799_415_299 -102_418_975 -12.81% 🚀
stack_1 3_357_497_507 3_778_945_524 -421_448_017 -11.15% 🚀
stack_5 14_036_020_145 15_738_223_846 -1_702_203_701 -10.82% 🚀
stack_10 26_233_598_416 29_542_694_740 -3_309_096_324 -11.20% 🚀
stack_20 51_950_481_451 66_032_420_478 -14_081_939_027 -21.33% 🚀
noop_baseline 363_294_902 0 +363_294_902 +inf%

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at 9b98f77.

@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_523_945_542 465_525_077_223 -1_131_681 -0.00%
alloc-0 598_700_320 599_843_943 -1_143_623 -0.19%
alloc-12 602_141_228 603_255_248 -1_114_020 -0.18%
alloc-143 761_918_079 763_104_169 -1_186_090 -0.16%
alloc-986 864_603_465 865_787_429 -1_183_964 -0.14%
alloc-10945 2_215_142_150 2_216_328_240 -1_186_090 -0.05%
alloc-46367 6_544_606_012 6_545_787_850 -1_181_838 -0.02%
alloc-121392 17_171_032_586 17_172_248_387 -1_215_801 -0.01%
alloc-317810 43_908_346_613 43_909_564_540 -1_217_927 -0.00%
counter_sync 653_512_086 695_201_799 -41_689_713 -6.00% 🚀
counter_async 818_768_695 865_267_022 -46_498_327 -5.37% 🚀
cross_program 2_198_807_101 2_391_505_600 -192_698_499 -8.06% 🚀
redirect 3_182_972_292 3_464_158_516 -281_186_224 -8.12% 🚀
stack_0 696_643_269 792_932_822 -96_289_553 -12.14% 🚀
stack_1 3_356_086_077 3_752_847_200 -396_761_123 -10.57% 🚀
stack_5 14_030_375_215 15_633_706_718 -1_603_331_503 -10.26% 🚀
stack_10 26_222_661_611 29_340_040_097 -3_117_378_486 -10.62% 🚀
stack_20 51_928_960_896 65_942_391_269 -14_013_430_373 -21.25% 🚀
noop_baseline 363_294_902 363_446_797 -151_895 -0.04%

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at 504ec80.

@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_523_945_542 465_525_077_223 -1_131_681 -0.00%
alloc-0 598_700_320 599_843_943 -1_143_623 -0.19%
alloc-12 602_141_228 603_255_248 -1_114_020 -0.18%
alloc-143 761_918_079 763_104_169 -1_186_090 -0.16%
alloc-986 864_603_465 865_787_429 -1_183_964 -0.14%
alloc-10945 2_215_142_150 2_216_328_240 -1_186_090 -0.05%
alloc-46367 6_544_606_012 6_545_787_850 -1_181_838 -0.02%
alloc-121392 17_171_032_586 17_172_248_387 -1_215_801 -0.01%
alloc-317810 43_908_346_613 43_909_564_540 -1_217_927 -0.00%
counter_sync 653_730_393 695_201_799 -41_471_406 -5.97% 🚀
counter_async 818_987_002 865_267_022 -46_280_020 -5.35% 🚀
cross_program 2_199_140_871 2_391_505_600 -192_364_729 -8.04% 🚀
redirect 3_183_501_094 3_464_158_516 -280_657_422 -8.10% 🚀
stack_0 697_568_275 792_932_822 -95_364_547 -12.03% 🚀
stack_1 3_360_177_351 3_752_847_200 -392_669_849 -10.46% 🚀
stack_5 14_047_131_561 15_633_706_718 -1_586_575_157 -10.15% 🚀
stack_10 26_255_249_297 29_340_040_097 -3_084_790_800 -10.51% 🚀
stack_20 51_993_211_262 65_942_391_269 -13_949_180_007 -21.15% 🚀
noop_baseline 363_294_902 363_446_797 -151_895 -0.04%

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at a6a2fe1.

@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_523_945_542 465_525_077_223 -1_131_681 -0.00%
alloc-0 598_700_320 599_843_943 -1_143_623 -0.19%
alloc-12 602_141_228 603_255_248 -1_114_020 -0.18%
alloc-143 761_918_079 763_104_169 -1_186_090 -0.16%
alloc-986 864_603_465 865_787_429 -1_183_964 -0.14%
alloc-10945 2_215_142_150 2_216_328_240 -1_186_090 -0.05%
alloc-46367 6_544_606_012 6_545_787_850 -1_181_838 -0.02%
alloc-121392 17_171_032_586 17_172_248_387 -1_215_801 -0.01%
alloc-317810 43_908_346_613 43_909_564_540 -1_217_927 -0.00%
counter_sync 653_730_393 695_201_799 -41_471_406 -5.97% 🚀
counter_async 818_987_002 865_267_022 -46_280_020 -5.35% 🚀
cross_program 2_199_139_165 2_391_505_600 -192_366_435 -8.04% 🚀
redirect 3_183_501_094 3_464_158_516 -280_657_422 -8.10% 🚀
stack_0 697_569_981 792_932_822 -95_362_841 -12.03% 🚀
stack_1 3_360_184_175 3_752_847_200 -392_663_025 -10.46% 🚀
stack_5 14_047_158_857 15_633_706_718 -1_586_547_861 -10.15% 🚀
stack_10 26_255_302_183 29_340_040_097 -3_084_737_914 -10.51% 🚀
stack_20 51_993_315_328 65_942_391_269 -13_949_075_941 -21.15% 🚀
noop_baseline 363_294_902 363_446_797 -151_895 -0.04%

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at e06176a.

@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_523_945_542 465_525_077_223 -1_131_681 -0.00%
alloc-0 598_700_320 599_843_943 -1_143_623 -0.19%
alloc-12 602_141_228 603_255_248 -1_114_020 -0.18%
alloc-143 761_918_079 763_104_169 -1_186_090 -0.16%
alloc-986 864_603_465 865_787_429 -1_183_964 -0.14%
alloc-10945 2_215_142_150 2_216_328_240 -1_186_090 -0.05%
alloc-46367 6_544_606_012 6_545_787_850 -1_181_838 -0.02%
alloc-121392 17_171_032_586 17_172_248_387 -1_215_801 -0.01%
alloc-317810 43_908_346_613 43_909_564_540 -1_217_927 -0.00%
counter_sync 653_730_393 695_201_799 -41_471_406 -5.97% 🚀
counter_async 818_987_002 865_267_022 -46_280_020 -5.35% 🚀
cross_program 2_199_139_165 2_391_505_600 -192_366_435 -8.04% 🚀
redirect 3_183_501_094 3_464_158_516 -280_657_422 -8.10% 🚀
stack_0 697_569_981 792_932_822 -95_362_841 -12.03% 🚀
stack_1 3_360_184_175 3_752_847_200 -392_663_025 -10.46% 🚀
stack_5 14_047_158_857 15_633_706_718 -1_586_547_861 -10.15% 🚀
stack_10 26_255_302_183 29_340_040_097 -3_084_737_914 -10.51% 🚀
stack_20 51_993_315_328 65_942_391_269 -13_949_075_941 -21.15% 🚀
noop_baseline 363_294_902 363_446_797 -151_895 -0.04%

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at f59aa21.

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

🔬 Benchmark Comparison

Benchmark Current Baseline Change Change % Status
compute 465_523_945_542 465_525_077_223 -1_131_681 -0.00%
alloc-0 598_700_320 599_843_943 -1_143_623 -0.19%
alloc-12 602_141_228 603_255_248 -1_114_020 -0.18%
alloc-143 761_918_079 763_104_169 -1_186_090 -0.16%
alloc-986 864_603_465 865_787_429 -1_183_964 -0.14%
alloc-10945 2_215_142_150 2_216_328_240 -1_186_090 -0.05%
alloc-46367 6_544_606_012 6_545_787_850 -1_181_838 -0.02%
alloc-121392 17_171_032_586 17_172_248_387 -1_215_801 -0.01%
alloc-317810 43_908_346_613 43_909_564_540 -1_217_927 -0.00%
counter_sync 655_716_261 695_201_799 -39_485_538 -5.68% 🚀
counter_async 821_112_641 865_267_022 -44_154_381 -5.10% 🚀
cross_program 2_207_576_341 2_391_505_600 -183_929_259 -7.69% 🚀
redirect 3_198_180_511 3_464_158_516 -265_978_005 -7.68% 🚀
stack_0 701_198_340 792_932_822 -91_734_482 -11.57% 🚀
stack_1 3_378_614_729 3_752_847_200 -374_232_471 -9.97% 🚀
stack_5 14_123_002_376 15_633_706_718 -1_510_704_342 -9.66% 🚀
stack_10 26_406_956_141 29_340_040_097 -2_933_083_956 -10.00% 🚀
stack_20 52_286_821_567 65_942_391_269 -13_655_569_702 -20.71% 🚀
noop_baseline 363_294_902 363_446_797 -151_895 -0.04%

Legend

  • 🚀 Significant improvement (>5% reduction)
  • 👍 Minor improvement (<5% reduction)
  • ✅ No significant change
  • ⚠️ Minor regression (<5% increase)
  • ❌ Significant regression (>5% increase)

🤖 This comment was automatically generated by the benchmark comparison workflow at 9af44cc.

@vobradovich
vobradovich requested review from StackOverflowExcept1on and ukint-vs and removed request for techraed June 2, 2026 17:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-benchmarks Enables running benchmarks in CI rust Pull requests that update Rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants