# Performance

In addition to the data integirty benefits, [normalized caching](https://dataclient.io/docs/concepts/normalization.md) with entity-level memoization enables
significant performance gains for rich interactive applications.

## React rendering benchmarks

Full rendering pipeline (fetch through DOM commit) measured in a real browser via Playwright.
React baseline uses useEffect + useState from the React docs.

[View benchmark source](https://github.com/reactive/data-client/tree/master/examples/benchmark-react) · [Performance over time](https://reactive.github.io/data-client/react-bench/)

- **Cached Navigation**: Navigating between a full list and items in the list ten times.
- **Mutation Propagation**: One store write updates every view that references the entity.
- **Scaling**: Mutations with 10k items in the list rendered.

These benchmarks measure the framework's impact within the larger system. That
makes them most useful as comparisons between approaches, rather than as
absolute measurements of an application's overall performance. We use them to
guide library optimizations and catch performance regressions over time.

## Normalization benchmarks

Denormalization compared with the legacy [normalizr](https://github.com/paularmstrong/normalizr)
library. Entity-level memoization maintains global referential equality and
speeds up repeated access, including after [mutations](https://dataclient.io/docs/getting-started/mutations.md).

[View benchmark source](https://github.com/reactive/data-client/blob/master/examples/benchmark)
