Skip to content

Compact invoke session bookkeeping - #48

Merged
SandroMaglione merged 1 commit into
mainfrom
codex/compact-invoke-sessions
Aug 8, 2026
Merged

Compact invoke session bookkeeping#48
SandroMaglione merged 1 commit into
mainfrom
codex/compact-invoke-sessions

Conversation

@SandroMaglione

@SandroMaglione SandroMaglione commented Aug 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace the invoked-child session Ref and persistent HashMap with one compact runtime-owned Map.
  • Keep every session mutation deferred inside synchronous Effects so reservation, removal, stale-token checks, and bulk shutdown remain atomic between fiber steps.
  • Preserve path-scoped invoke identity, child stop ordering, and stale callback protection while removing two Effect data structures from every invoke-capable machine.

Changeset

  • Added or updated for a library or package-metadata change
  • Not required because this PR does not change src/ or package.json

Validation

  • pnpm check
  • Relevant example checks, when examples changed (no examples changed)
  • Reviewed the automated type-performance report, when the public TypeScript API or inference changed (no public API change; local budgets pass)
  • Reviewed the automated runtime-performance report, when runtime behavior changed

CI confirms parent with one child lifecycle +2.0%, family heap -0.4%, and observed-family heap -0.3%; standalone memory controls remain flat.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Type performance

Measured with TypeScript 6.0.3 and skipLibCheck=true.

Scenario Base PR Difference
Effect only 55 55 0 (0.0%)
Import effect-machine 55 55 0 (0.0%)
Machine.defineStates (3 states) 2,965 2,965 0 (0.0%)
Machine.make (3 states, 2 events) 8,715 8,715 0 (0.0%)
machine.handle (3 states, 2 transitions) 23,492 23,492 0 (0.0%)
machine.handle (depth 8) 117,075 117,075 0 (0.0%)
machine.handle (depth 12) 129,713 129,713 0 (0.0%)
machine.handle (depth 16) 145,055 145,055 0 (0.0%)
machine.handle (depth 24) 183,851 183,851 0 (0.0%)
machine.handle (wide depth 16) 214,189 214,189 0 (0.0%)
machine.handle (parallel/history/choice) 132,667 132,667 0 (0.0%)
machine.handle (4 successive calls) 128,674 128,674 0 (0.0%)
machine exact input/output/error/services 110,584 110,584 0 (0.0%)
execution adapter readiness 127,854 127,854 0 (0.0%)

Marginal instantiations are measured against the matching setup without that API call:

Scenario Base PR Difference
Import effect-machine 0 0 0
Machine.defineStates (3 states) 2,910 2,910 0 (0.0%)
Machine.make (3 states, 2 events) 5,742 5,742 0 (0.0%)
machine.handle (3 states, 2 transitions) 14,777 14,777 0 (0.0%)
machine.handle (depth 8) 109,601 109,601 0 (0.0%)
machine.handle (depth 12) 121,039 121,039 0 (0.0%)
machine.handle (depth 16) 135,181 135,181 0 (0.0%)
machine.handle (depth 24) 171,577 171,577 0 (0.0%)
machine.handle (wide depth 16) 202,224 202,224 0 (0.0%)
machine.handle (parallel/history/choice) 114,331 114,331 0 (0.0%)
machine.handle (4 successive calls) 113,703 113,703 0 (0.0%)
machine exact input/output/error/services 100,670 100,670 0 (0.0%)
execution adapter readiness 102,092 102,092 0 (0.0%)
Check times (informational)
Scenario Base PR
Effect only 0.03s 0.03s
Import effect-machine 0.03s 0.03s
Machine.defineStates (3 states) 0.09s 0.09s
Machine.make (3 states, 2 events) 0.15s 0.15s
machine.handle (3 states, 2 transitions) 0.21s 0.23s
machine.handle (depth 8) 0.47s 0.48s
machine.handle (depth 12) 0.51s 0.53s
machine.handle (depth 16) 0.55s 0.57s
machine.handle (depth 24) 0.64s 0.63s
machine.handle (wide depth 16) 0.69s 0.69s
machine.handle (parallel/history/choice) 0.56s 0.58s
machine.handle (4 successive calls) 0.55s 0.55s
machine exact input/output/error/services 0.47s 0.47s
execution adapter readiness 0.53s 0.52s

Type instantiations are the comparison metric. Check time varies with runner load and is informational only.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Runtime performance

Median of 5 independent benchmark processes on AMD EPYC 7763 64-Core Processor with Node v24.18.0.

Pull request baseline

Scenario Effect Machine XState 5 XState 6 alpha
Plan counter transitions 106,800 transitions/s 134,171 transitions/s 122,420 transitions/s
Drain burst with terminal fence 73,459 increments/s 402,907 increments/s 112,461 increments/s
Drain burst with a change observer 57,549 increments/s 399,981 increments/s 112,087 increments/s
Lookup and send to one child 67,299 increments/s 397,328 increments/s 106,707 increments/s
Start and stop a machine 11,797 machines/s 182,815 machines/s 72,961 machines/s
Start and stop a parent with one child 4,151 families/s 67,536 families/s 26,702 families/s
Memory profile Effect Machine XState 5 XState 6 alpha Effect runtime primitives
Idle machine 14.8 KiB 3.8 KiB 6.1 KiB
Raw managed process 13.2 KiB
Two independent idle machines 28.9 KiB 7.3 KiB 11.8 KiB
Idle parent with one child 36.8 KiB 5.5 KiB 8.8 KiB
Parent with observed child registry 48.2 KiB
Parent with observed invoked child snapshots 37.0 KiB
Suspended Effect fiber 0.7 KiB
Effect queue with waiting fiber 2.8 KiB
Effect mailbox actor shell 3.2 KiB

Effect Machine change from base

Metric Base Base variability PR PR variability Difference
Plan counter transitions 108,866 transitions/s 1.6% MAD 106,800 transitions/s 0.7% MAD -1.9%
Drain burst with terminal fence 74,009 increments/s 1.7% MAD 73,459 increments/s 0.9% MAD -0.7%
Drain burst with a change observer 57,724 increments/s 1.6% MAD 57,549 increments/s 0.0% MAD -0.3%
Lookup and send to one child 67,509 increments/s 1.3% MAD 67,299 increments/s 0.7% MAD -0.3%
Start and stop a machine 11,829 machines/s 2.4% MAD 11,797 machines/s 0.7% MAD -0.3%
Start and stop a parent with one child 4,068 families/s 0.9% MAD 4,151 families/s 0.8% MAD +2.0%
Idle machine heap per unit 14.8 KiB 0.0% MAD 14.8 KiB 0.0% MAD -0.0%
Raw managed process heap per unit 13.2 KiB 0.0% MAD 13.2 KiB 0.0% MAD -0.0%
Two independent idle machines heap per unit 28.9 KiB 0.0% MAD 28.9 KiB 0.0% MAD -0.0%
Idle parent with one child heap per unit 36.9 KiB 0.0% MAD 36.8 KiB 0.0% MAD -0.4%
Parent with observed child registry heap per unit 48.3 KiB 0.0% MAD 48.2 KiB 0.0% MAD -0.3%
Parent with observed invoked child snapshots heap per unit 37.1 KiB 0.0% MAD 37.0 KiB 0.0% MAD -0.4%
Versions and interpretation
  • Effect Machine: 0.3.0
  • XState 5: 5.32.5
  • XState 6 alpha: 6.0.0-alpha.27
  • Effect runtime primitives: 4.0.0-beta.105

Higher throughput is better; lower heap is better. Variability is the median absolute deviation across independent processes, relative to their median. Runtime measurements on shared GitHub-hosted hardware remain informational, so small differences should be confirmed across multiple workflow runs.

@SandroMaglione
SandroMaglione merged commit 80b3e73 into main Aug 8, 2026
9 checks passed
@SandroMaglione
SandroMaglione deleted the codex/compact-invoke-sessions branch August 8, 2026 15:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant