Skip to content

Compile hierarchical machine execution - #62

Merged
SandroMaglione merged 1 commit into
mainfrom
codex/compiled-hierarchical-kernel
Aug 9, 2026
Merged

Compile hierarchical machine execution#62
SandroMaglione merged 1 commit into
mainfrom
codex/compiled-hierarchical-kernel

Conversation

@SandroMaglione

Copy link
Copy Markdown
Member

Summary

  • compile event dispatch and hierarchy metadata for eligible compound and parallel machines
  • specialize value-only leaf updates, final-state checks, and single-transition microsteps while preserving the general planner fallback
  • add repeatable compound and parallel runtime benchmarks for Effect Machine, XState 5, and XState 6
  • add differential coverage for parallel transitions, raised events, lazy context reads, completion, and managed runtime publication

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
  • Reviewed the automated type-performance report, when the public TypeScript API or inference changed
  • Reviewed the automated runtime-performance report, when runtime behavior changed

Local runtime comparison (Apple M1, Node v24.16.0; 5 base and 3 final-candidate processes) measured +88.9% compound-state throughput and +112.6% parallel-state throughput, with existing throughput and memory metrics unchanged within process variability.

@github-actions

github-actions Bot commented Aug 9, 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.10s 0.10s
Machine.make (3 states, 2 events) 0.16s 0.16s
machine.handle (3 states, 2 transitions) 0.22s 0.24s
machine.handle (depth 8) 0.52s 0.51s
machine.handle (depth 12) 0.56s 0.55s
machine.handle (depth 16) 0.60s 0.59s
machine.handle (depth 24) 0.68s 0.69s
machine.handle (wide depth 16) 0.73s 0.77s
machine.handle (parallel/history/choice) 0.61s 0.62s
machine.handle (4 successive calls) 0.58s 0.61s
machine exact input/output/error/services 0.49s 0.49s
execution adapter readiness 0.58s 0.57s

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

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Runtime performance

Median of 5 independent benchmark processes on INTEL(R) XEON(R) PLATINUM 8573C with Node v24.18.0.

Pull request baseline

Scenario Effect Machine XState 5 XState 6 alpha
Plan counter transitions 131,209 transitions/s 143,981 transitions/s 111,972 transitions/s
Drain burst with terminal fence 266,919 increments/s 421,501 increments/s 106,382 increments/s
Drain burst with a change observer 181,759 increments/s 417,925 increments/s 106,290 increments/s
Lookup and send to one child 239,494 increments/s 418,892 increments/s 102,141 increments/s
Start and stop a machine 41,887 machines/s 201,694 machines/s 80,064 machines/s
Start and stop a parent with one child 16,564 families/s 77,997 families/s 33,049 families/s
Drain burst through a compound state 253,444 events/s 369,263 events/s 106,513 events/s
Drain burst through two parallel regions 239,412 events/s 287,376 events/s 92,491 events/s

Effect runtime reference points

Scenario Effect Machine Effect runtime primitives
Start and stop a raw compiled process 45,161 processes/s
Start and interrupt a suspended fiber 191,314 fibers/s
Start and stop a queue worker 136,388 workers/s
Start and stop an actor shell 127,049 actors/s
Start and stop two actor shells 78,296 families/s
Update an owner-only mutable snapshot 300,210,147 updates/s
Update a synchronized snapshot 1,759,919 updates/s
Create, resolve, and await a terminal latch 1,659,335 latches/s
Memory profile Effect Machine XState 5 XState 6 alpha Effect runtime primitives
Idle machine 2.0 KiB 3.8 KiB 6.1 KiB
Raw generic managed process 12.3 KiB
Raw compiled process 2.7 KiB
Two independent idle machines 3.5 KiB 7.3 KiB 11.8 KiB
Idle parent with one child 5.8 KiB 5.5 KiB 8.8 KiB
Parent with observed child registry 10.0 KiB
Parent with observed invoked child snapshots 5.9 KiB
Suspended Effect fiber 0.7 KiB
Effect queue with waiting fiber 2.8 KiB
Effect mailbox actor shell 3.2 KiB
Two Effect actor shells 6.9 KiB

Effect Machine change from base

Metric Base Base variability PR PR variability Difference
Plan counter transitions 132,243 transitions/s 1.0% MAD 131,209 transitions/s 0.1% MAD -0.8%
Drain burst with terminal fence 269,459 increments/s 0.7% MAD 266,919 increments/s 1.3% MAD -0.9%
Drain burst with a change observer 179,879 increments/s 1.1% MAD 181,759 increments/s 0.8% MAD +1.0%
Lookup and send to one child 240,082 increments/s 0.5% MAD 239,494 increments/s 0.2% MAD -0.2%
Start and stop a machine 41,776 machines/s 0.2% MAD 41,887 machines/s 0.4% MAD +0.3%
Start and stop a parent with one child 16,543 families/s 0.1% MAD 16,564 families/s 0.6% MAD +0.1%
Drain burst through a compound state 133,007 events/s 0.8% MAD 253,444 events/s 0.6% MAD +90.5%
Drain burst through two parallel regions 119,945 events/s 0.5% MAD 239,412 events/s 1.3% MAD +99.6%
Idle machine heap per unit 2.0 KiB 0.0% MAD 2.0 KiB 0.0% MAD 0.0%
Raw generic managed process heap per unit 12.3 KiB 0.0% MAD 12.3 KiB 0.0% MAD +0.0%
Raw compiled process heap per unit 2.7 KiB 0.1% MAD 2.7 KiB 0.1% MAD +0.0%
Two independent idle machines heap per unit 3.5 KiB 0.0% MAD 3.5 KiB 0.0% MAD -0.0%
Idle parent with one child heap per unit 5.8 KiB 0.1% MAD 5.8 KiB 0.0% MAD +0.5%
Parent with observed child registry heap per unit 10.0 KiB 0.0% MAD 10.0 KiB 0.0% MAD -0.0%
Parent with observed invoked child snapshots heap per unit 5.9 KiB 0.1% MAD 5.9 KiB 0.0% MAD -0.1%

Effect runtime reference change from base

Metric Base Base variability PR PR variability Difference
Start and stop a raw compiled process 45,556 processes/s 0.3% MAD 45,161 processes/s 0.2% MAD -0.9%
Start and interrupt a suspended fiber 192,790 fibers/s 0.1% MAD 191,314 fibers/s 1.2% MAD -0.8%
Start and stop a queue worker 139,140 workers/s 2.0% MAD 136,388 workers/s 1.4% MAD -2.0%
Start and stop an actor shell 128,123 actors/s 0.8% MAD 127,049 actors/s 1.3% MAD -0.8%
Start and stop two actor shells 79,650 families/s 0.7% MAD 78,296 families/s 1.3% MAD -1.7%
Update an owner-only mutable snapshot 302,023,558 updates/s 0.0% MAD 300,210,147 updates/s 0.7% MAD -0.6%
Update a synchronized snapshot 1,727,993 updates/s 2.8% MAD 1,759,919 updates/s 0.8% MAD +1.8%
Create, resolve, and await a terminal latch 1,673,495 latches/s 1.0% MAD 1,659,335 latches/s 0.3% MAD -0.8%
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 e7be28f into main Aug 9, 2026
9 checks passed
@SandroMaglione
SandroMaglione deleted the codex/compiled-hierarchical-kernel branch August 9, 2026 13:03
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