Capabilities
Performance that stays on the platform
NativeCoreJS updates the DOM through signals and bind — no virtual DOM,
no full re-render of the page. Explore live demos, then see a lab snapshot of the
reactive micro-benchmarks.
What this page shows
- One signal can drive many bound elements without rebuilding the tree
- Fine-grained updates stay cheap as subscriber count grows
- You can re-run the same suite in the monorepo with
npm run bench
Surgical DOM updates
A single signal ticks below. Only the bound nodes change — the surrounding markup
is not recreated. That is the same path your controllers use with
this.signal / this.state and this.bind.
Live example
Updates: 0 · DOM writes: 0
Idle
Each tick sets signal state once; bind writes text into the live nodes.
No template re-parse, no virtual tree diff.
One signal, many listeners
Forty-eight cells subscribe to the same counter. Incrementing once fans out to every cell — useful for dashboards, badges, and shared UI chrome.
Live example
Shared value: 0
Live micro-bench (this browser)
Run a short in-page stress test: create a signal, set it many times, and measure throughput on your machine. Results vary by CPU and tab load — that is expected.
Ready — click to run.
Lab snapshot
From the monorepo suite (npm run bench) on Node
v22.13.0, recorded
. This is a capability snapshot, not a leaderboard.
| Scenario | ops/s |
|---|---|
| create 100k state instances | 717,721 |
| set value 100k times | 4,350,092 |
| get value 100k times | 57,000,194 |
| set + get 100k pairs | 4,065,365 |
| propagate through 1 computed 50k× | 1,833,502 |
| read computed 50k× | 71,162,221 |
| effect fires 50k× (1 dep) | 2,274,729 |
| 1 subscriber, 100k updates | 4,069,338 |
| 10 subscribers, 20k updates | 3,100,419 |
| 100 subscribers, 5k updates | 890,951 |
Full suite: benchmarks/state.bench.ts — create/set/get,
computed chains, effects with cleanup, and 1 / 10 / 100 subscriber fan-out.
Production budgets
build:ssg)