# Performance Habits — .NET Core: Build, Test and Ship Web APIs

Source: https://www.geekswithgeeks.com/en/dotnet-core/ship-performance

> Apply async I/O, response caching and compression and measure before optimising.

## Measure first

Most slow APIs are slow because of the database or a remote call, not C#. Fix N+1 queries, add indexes, use async everywhere, and only then consider caching. Guessing without measuring wastes time.

## Output caching and compression

Cache a read-heavy, rarely changing endpoint for 30 seconds and compress responses. Never cache user-specific data under a shared key.

```csharp
builder.Services.AddOutputCache();
builder.Services.AddResponseCompression();

var app = builder.Build();
app.UseResponseCompression();
app.UseOutputCache();

app.MapGet("/catalog", () => Catalog.LoadAll())
   .CacheOutput(p => p.Expire(TimeSpan.FromSeconds(30)));
```

## Use health checks

Map `app.MapHealthChecks("/healthz")` so load balancers and Kubernetes can tell whether your app is alive. Add structured logging and metrics (OpenTelemetry) so you can see problems before users report them.

**Quiz:** What should you do before adding caching to a slow endpoint?

- [ ] Rewrite it in another language
- [ ] Turn off logging
- [ ] Add more middleware
- [x] Measure to find the real bottleneck

*Answer:* Measure to find the real bottleneck. Profiling or query logs usually show the real cause, such as an N+1 query, which caching would only hide.
