<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga" -->

---
title: Improving Performance in .NET Applications | daily.dev
description: A conference talk transcript walks through practical .NET performance tooling and mindset, drawing on 30 years of software development experience. It covers...
canonical: https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Improving Performance in .NET Applications | daily.dev
og:description: A conference talk transcript walks through practical .NET performance tooling and mindset, drawing on 30 years of software development experience. It covers...
og:url: https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga
og:image: https://api.daily.dev/og/posts/sYMpcjIga.png
og:image:alt: Improving Performance in .NET Applications
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Improving Performance in .NET Applications

**[.NET Blog](https://daily.dev/sources/dotnet)** · 75 min read · 8 upvotes · 1 comments

## Summary

A conference talk transcript walks through practical .NET performance tooling and mindset, drawing on 30 years of software development experience. It covers BenchmarkDotNet for measuring code performance and memory allocation, Visual Studio's performance profiler for finding CPU hot paths, and Microsoft.Diagnostics.Runtime for building custom memory analysis tools. Demos include array allocation micro-benchmarks (array.Empty vs new array), a real client case where manually copying arrays caused exponential slowdown at scale, and string concatenation benchmarks comparing plus-operator concatenation, StringBuilder, and string interpolation across .NET Framework 4.8 and .NET 10. Key advice: measure rather than rely on intuition, move off .NET Framework onto modern .NET for ongoing performance gains, use centralized package management, and enable full analyzer warnings treated as errors to catch performance issues early.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.youtube.com/watch?v=bwKmnINg-sY>

## Questions this post answers

### Should I use benchmarking tools like a stopwatch loop to measure C# method performance?

No, a manual stopwatch loop is unreliable because it does not account for garbage collector pauses or allocation overhead. BenchmarkDotNet is recommended instead since it runs many iterations, produces statistically solid timing and memory allocation numbers, and is used internally by the Microsoft team for their own performance measurements.

_Developers deciding how to benchmark C# code reliably can find grounded comparisons like this on daily.dev._

### Is Array.Empty<T>() faster than creating a new empty array in C#?

Yes, measurably faster: a benchmark comparing new T[0] against Array.Empty<T>() showed the new-array approach took about 4.6 nanoseconds and allocated 24 bytes, while Array.Empty<T>() took about 0.1 nanoseconds and allocated zero bytes. On a hot path executing this pattern frequently, switching to Array.Empty<T>() or the equivalent collection expression syntax can save meaningful memory and time.

_Anyone chasing small allocation wins in C# code can track micro-benchmark facts like this on daily.dev._

### Why should I get off .NET Framework and move to modern .NET for performance reasons?

.NET Framework is capped at version 4.8 permanently and runs only on Windows, so it never receives the newer runtime and language performance improvements that have accumulated in .NET over the last five to ten years. String builder concatenation, for example, benchmarked at 71 nanoseconds on .NET 10 versus 110 nanoseconds on .NET Framework 4.8, with the gap widening as data size grows.

_Teams weighing a .NET Framework to .NET migration for performance can follow this kind of comparison on daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@agustinbarrientos** · 0 upvotes

> Benchmark first, argue second

## Similar posts on daily.dev

- [.NET Toolbox August Update](https://daily.dev/posts/net-toolbox-august-update-vi5nnzduw) · We Are .NET · 12 upvotes · 1 comments

---

Tags: [#performance](https://daily.dev/tags/performance), [#.net](https://daily.dev/tags/.net), [#c#](https://daily.dev/tags/c#), [#visual-studio](https://daily.dev/tags/visual-studio)

[View this post on daily.dev](https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Improving Performance in .NET Applications","url":"https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga"},"datePublished":"2026-08-20T16:22:27.897Z","dateModified":"2026-09-14T06:31:16.846Z","description":"A conference talk transcript walks through practical .NET performance tooling and mindset, drawing on 30 years of software development experience. It covers...","image":"https://i.ytimg.com/vi/bwKmnINg-sY/sddefault.jpg","thumbnailUrl":"https://i.ytimg.com/vi/bwKmnINg-sY/sddefault.jpg","isAccessibleForFree":true,"articleSection":".NET Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":".NET Blog","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/f23eb59371bd4f07aeef64c4eef73266","url":"https://daily.dev/sources/dotnet"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":8},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"performance,.net,c#,visual-studio","timeRequired":"PT75M","video":{"@type":"VideoObject","name":"Improving Performance in .NET Applications","description":"A conference talk transcript walks through practical .NET performance tooling and mindset, drawing on 30 years of software development experience. It covers...","thumbnailUrl":"https://i.ytimg.com/vi/bwKmnINg-sY/sddefault.jpg","uploadDate":"2026-08-20T16:22:27.897Z","duration":"PT75M","url":"https://api.daily.dev/r/sYMpcjIga","embedUrl":"https://www.youtube.com/embed/bwKmnINg-sY"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":".NET Blog","item":"https://daily.dev/sources/dotnet"},{"@type":"ListItem","position":3,"name":"Improving Performance in .NET Applications"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga","comment":[{"@type":"Comment","text":"Benchmark first, argue second","datePublished":"2026-08-21T10:31:41.928Z","url":"https://daily.dev/posts/sYMpcjIga#c-ctbL0NYeQ","author":{"@type":"Person","name":"Agustin Barrientos","url":"https://daily.dev/agustinbarrientos","image":"https://media.daily.dev/image/upload/s--5ayxQnqn--/f_auto/v1788281802/avatars/avatar_wQYYVe5Tbj0NJ7C7qPoa8?_a=BAMAMicg0"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/improving-performance-in-net-applications-sympcjiga#faq","mainEntity":[{"@type":"Question","name":"Should I use benchmarking tools like a stopwatch loop to measure C# method performance?","acceptedAnswer":{"@type":"Answer","text":"No, a manual stopwatch loop is unreliable because it does not account for garbage collector pauses or allocation overhead. BenchmarkDotNet is recommended instead since it runs many iterations, produces statistically solid timing and memory allocation numbers, and is used internally by the Microsoft team for their own performance measurements. Developers deciding how to benchmark C# code reliably can find grounded comparisons like this on daily.dev."}},{"@type":"Question","name":"Is Array.Empty<T>() faster than creating a new empty array in C#?","acceptedAnswer":{"@type":"Answer","text":"Yes, measurably faster: a benchmark comparing new T[0] against Array.Empty<T>() showed the new-array approach took about 4.6 nanoseconds and allocated 24 bytes, while Array.Empty<T>() took about 0.1 nanoseconds and allocated zero bytes. On a hot path executing this pattern frequently, switching to Array.Empty<T>() or the equivalent collection expression syntax can save meaningful memory and time. Anyone chasing small allocation wins in C# code can track micro-benchmark facts like this on daily.dev."}},{"@type":"Question","name":"Why should I get off .NET Framework and move to modern .NET for performance reasons?","acceptedAnswer":{"@type":"Answer","text":".NET Framework is capped at version 4.8 permanently and runs only on Windows, so it never receives the newer runtime and language performance improvements that have accumulated in .NET over the last five to ten years. String builder concatenation, for example, benchmarked at 71 nanoseconds on .NET 10 versus 110 nanoseconds on .NET Framework 4.8, with the gap widening as data size grows. Teams weighing a .NET Framework to .NET migration for performance can follow this kind of comparison on daily.dev."}}]}
```

