โ† Back to Home

โšก Live Performance Benchmark

Watch SignalForge vs traditional state management in real-time. See the render count difference yourself!

๐ŸŽฏ What You're About To See

โœ… SignalForge (Green)

When one counter updates, only that counter re-renders. The other 9 counters stay frozen. This is fine-grained reactivity.

1 update = 1 re-render

โš ๏ธ Traditional State (Orange)

When one counter updates, all 10 counters re-render because they share the same state object. This is the React/Context/Redux default.

1 update = 10 re-renders (10x waste!)

โš™๏ธ Benchmark Controls

Click start and watch the render counters below each number

Total Updates

0

Changes to state

SignalForge Renders

0

Component re-renders

Traditional Renders

0

Component re-renders

Efficiency Gain

0%

Fewer re-renders

โœ… SignalForge (Fine-Grained)

0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0

๐Ÿ‘€ Watch the "Renders" count - only the changed counter increments!

โš ๏ธ Traditional State (Coarse-Grained)

0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0
0
Renders: 0

๐Ÿ‘€ ALL counters show the same render count - they all re-render together!

๐Ÿงช Why This Matters

๐Ÿ“ฑ Mobile Performance

With 100 items on screen, traditional state causes 100 re-renders per update. On slower mobile devices, this causes visible lag. SignalForge? Still just 1 re-render.

โšก Battery Life

Fewer re-renders = less CPU usage = longer battery life. In this demo with 100 updates, traditional state does 1,000 re-renders. SignalForge does 100. That's 10x less work.

๐ŸŽฎ Real-Time Apps

Games, collaborative editors, live dashboards - any app with frequent updates will be noticeably smoother with SignalForge. Users won't see jank or frame drops.

๐Ÿ“Š Performance at Scale

ScenarioItemsSignalForgeTraditionalDifference
Simple counter list101 render10 renders10x slower
Product grid1001 render100 renders100x slower
Dashboard widgets501 render50 renders50x slower
Chat messages10001 render1000 renders1000x slower
Large spreadsheet10,0001 render โšก10,000 renders ๐Ÿ”ฅUNUSABLE

๐Ÿ”ฌ Technical Implementation

SignalForge

// Each counter is independent signal
const counters = Array.from({ length: 10 }, 
  () => createSignal(0)
);

// Component subscribes to ONE signal
function Counter({ index }) {
  const value = useSignalValue(
    counters[index]
  );
  // Only re-renders when THIS counter changes
  return <div>{value}</div>;
}

// Update one counter
counters[5].set(counters[5].get() + 1);
// Result: Only Counter(index=5) re-renders โœ…

Traditional State

// All counters in one state
const [counters, setCounters] = useState(
  Array(10).fill(0)
);

// Component reads from shared state
function Counter({ index }) {
  // Subscribes to ENTIRE array
  return <div>{counters[index]}</div>;
}

// Update one counter
setCounters(prev => {
  const next = [...prev];
  next[5] += 1;
  return next;
});
// Result: ALL 10 Counters re-render โŒ