To speed up an Angular app, first find out whether the delay comes from loading JavaScript, Angular checking components, application code, browser rendering, or third-party scripts. Profile a repeatable user journey, make the narrowest change that addresses the measured bottleneck, then compare the build and real-user results. OnPush, stable list tracking, signals, and lazy loading can help in the right circumstances; none guarantees a fixed speedup by itself.
How do you find what is actually slow?
Start with a baseline, not a framework-wide checklist. Repeat the same user journey before and after a change, and note where time is spent. Angular’s Chrome DevTools integration connects browser performance entries with Angular component, change-detection, and lifecycle details. It can help distinguish Angular work from layout, paint, and unrelated scripts. Angular DevTools also visualizes change-detection cycles.
As an Amazon Associate I earn from qualifying purchases.
The Angular profiling integration works only in development mode, so use it to diagnose code paths—not as a measure of production user experience. Pair it with production field data to understand the impact on real devices and networks. Angular’s official performance guidance recommends profiling first when the bottleneck is unclear; the documentation page showed Angular v22.2.1 when accessed on October 7, 2026.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →- Choose a repeatable user journey, such as loading a key page and filtering a list.
- Record a baseline profile and identify the dominant work: initial loading, Angular checks, application code, browser rendering, or third-party scripts.
- Change one relevant thing at a time, then repeat the journey and compare the profile.
- Check production field metrics and bundle output as well as the development profile.
The available guidance does not establish a universal percentage improvement for any of these techniques. Treat a speedup as a result to measure in your application, not a promise attached to a feature.
#1 Best Overall
Does OnPush make Angular faster?
It can reduce avoidable component checks when profiling shows that unchanged parts of a large component tree are being checked unnecessarily. OnPush is selective checking, not a guarantee that change detection never runs. Angular has made OnPush the default strategy since Angular 22; projects on earlier releases may have different defaults, so inspect the actual component configuration.
An OnPush component is checked when, for example, it receives a new template-bound input, an event occurs in its subtree, or it is explicitly marked. Angular compares input values with Object.is. If code mutates an input object but keeps the same reference, that mutation alone does not make Angular treat the input as changed.
Update inputs without hiding changes
Prefer immutable updates when replacing an object passed to an OnPush component. Create a new object or array when its data changes, so the changed reference can notify the component. Where appropriate, use signals, AsyncPipe, or markForCheck to notify Angular about updates. Events inside an OnPush subtree still cause relevant components and ancestors to be checked.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Fix the driver behind crashes, sound loss and screen glitches3Clear out junk files and repair common Windows errorsRank #2
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: '<p>{{ product.name }}</p>'
})
export class ProductRowComponent {
@Input() product!: Product;
}
// Replace the object rather than mutating the existing input reference.
this.product = { ...this.product, name: 'Updated name' };
In Angular 22, explicitly specifying OnPush is optional for components that use the default. It can still make intent clear in code that supports earlier Angular versions.
How should you track repeated rows in Angular 2026?
Use the current @for syntax with a stable, unique key such as an item’s id or uuid. The tracking expression maps each data item to its DOM node, allowing Angular to reuse nodes and perform only the necessary DOM operations when the collection changes.
@for (product of products(); track product.id) {
<app-product-row [product]="product" />
} @empty {
<p>No products found.</p>
}
- Use a stable unique identifier when one is available.
- Use
$indexonly when the collection is static and items will not be inserted, removed, or reordered. - Tracking by object reference is a fallback; prefer a stable key when possible.
You may encounter the older *ngFor API and its trackBy callback in existing projects. For current templates, the identity-tracking role is expressed with @for and track.
Rank #3
When do signals help—and what do they not solve?
Signals make state dependencies explicit: when a signal’s value changes, its consumers can be notified. If an OnPush component reads a signal in its template, Angular tracks that dependency and marks the component for an update when the value changes.
For derived state, use a computed signal. Computed values are lazy and cache their result until a dependency changes. This can avoid repeatedly deriving the same value when its inputs are unchanged, but signals do not make expensive calculations or DOM work disappear. The calculation still needs to be efficient, and the rendered interface still has to be updated when its inputs change.
Do not use effects as a general way to copy one piece of state into another. Angular warns that using effects to propagate state can produce unnecessary change-detection cycles and circular-update problems. Prefer computed signals for ordinary derived values.
Rank #4
Should you lazy-load every Angular route?
No. Lazy loading moves code out of the initial request, but the deferred code must still be downloaded when the user visits that route. That trade-off can improve the first view while adding a request and latency to a later navigation. Keep primary landing pages eager when they are part of the initial experience, and consider lazy boundaries for other pages based on real navigation patterns.
| Choice | Potential benefit | Cost to measure |
|---|---|---|
| Eager route loading | Route code is available without waiting for a later route request. | More code may be needed for the initial view. |
| Lazy route loading | Code for a route can be requested only when that route is visited, reducing initial JavaScript. | The first visit to that route may require an additional request and increase transition latency. |
Angular route APIs such as loadComponent and loadChildren use asynchronous loaders, commonly with dynamic imports, to split route code into chunks. Angular also identifies @defer as an option for non-initial content and heavy dependencies. Avoid adding nested lazy boundaries automatically: additional navigation requests can make the experience feel slower. Compare first-route and subsequent-route behavior before and after a split.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Do standalone components reduce runtime or bundle size?
Standalone components describe how components import and compose their dependencies; standalone has been the default since Angular 19. That change in component organization does not, by itself, guarantee faster runtime or a smaller bundle. Treat standalone as an architectural and dependency-management choice, and judge its performance effect from the emitted build and user experience rather than the label.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.How do you measure production performance?
Use lab and field measurements for different jobs. A lab run is repeatable and useful for diagnosing regressions under controlled conditions. Field data shows how pages perform for actual visitors on their devices and networks. Review results by page and, where available, by device and network cohort; an application-wide average can conceal a slow route or a poor experience for a particular group.
For Core Web Vitals, web.dev’s guidance accessed October 7, 2026, defines a good experience using these thresholds:
| Metric | Good experience threshold | What it indicates |
|---|---|---|
| LCP | 2.5 seconds or less | How quickly the main page content appears. |
| INP | 200 milliseconds or less | How quickly the page responds to user interactions. |
| CLS | 0.1 or less | How much unexpected layout movement occurs. |
Evaluate those recommendations against at least 75% of page visits. These are web.dev/Chrome team thresholds and coverage guidance, not benchmark results for a particular Angular application. Lighthouse cannot measure INP without user interaction; Total Blocking Time (TBT) is a lab proxy, not a substitute for field INP.
How should you control bundle growth?
Angular CLI build budgets let a project configure warnings and errors for bundle sizes. An initial budget measures the JavaScript and CSS used to bootstrap the application. Choose thresholds for your app and its performance goals rather than copying a generic limit. Review budget changes alongside route-splitting decisions: a smaller initial bundle can be useful, but only if deferred routes still meet the experience you intend.
Which optimization should you try first?
Prioritize the measured user-visible problem, not the technique with the most familiar name. Use this decision path:
- Slow first view: inspect initial JavaScript and CSS, build budgets, and whether non-essential route or page code can be deferred.
- Repeated Angular checks: inspect change-detection activity and consider OnPush where unchanged subtrees are doing avoidable work.
- Rows replaced or redrawn after data changes: give
@fora stable identity key so Angular can map items to existing DOM nodes. - Repeated derived-state work: consider computed signals, while keeping the underlying calculation and rendered DOM work in view.
- Slow navigation after splitting: revisit the route boundary and compare eager loading with lazy loading for that user journey.
- Layout, paint, or unrelated script work: address the browser or third-party cause shown in the profile rather than changing Angular’s change-detection strategy by default.
After each change, repeat the same profile and check production outcomes. Keep a change only when the measured benefit justifies its engineering cost and regression risk.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




