Awesome .NET Performance
A curated list of awesome .NET Performance books, courses, trainings, conference talks, blogs and most inspiring open source contributors. Inspired by awesome-… stuff.
Books
- Pro .NET Performance: Optimize Your C# Applications by Sasha Goldshtein, Dima Zurbalev, Ido Flatow (2012)
- Pro .NET Memory Management: For Better Code, Performance, and Scalability by Konrad Kokosa (2018)
- Pro .NET Benchmarking: The Art of Performance Measurement by Andrey Akinshin (2019)
- CLR via C# by Jeffrey Richter (2012)
- Pro Asynchronous Programming with .NET by Richard Blewett, Andrew Clymer (2013)
- Writing High-Performance .NET Code by Ben Watson (2018)
- Advanced .NET Debugging by Mario Hewardt (2009)
- Concurrent Programming on Windows by Joe Duffy (2008)
- .NET IL Assembler by Serge Lidin (2014)
- High-Performance Windows Store Apps by Brian Rasmussen (2014)
- Customizing the Microsoft® .NET Framework Common Language Runtime by Steven Pratschner (2005)
- Under the Hood of .NET Memory Management by Chris Farrell and Nick Harrison (2011)
- Functional Concurrency in .NET by Riccardo Terrell (2018)
Video Courses
- Mastering .NET Performance Tuning by John Robbins
- Using Threads Effectively to Build Scalable, Responsive, and Fast .NET Applications and Components by Jeffrey Richter
- Making .NET Applications Faster by Sasha Goldshtein
- Making .NET Applications Even Faster by Sasha Goldshtein
- Measuring .NET Performance by Sasha Goldshtein
- PerfView Tutorial by Vance Morrison
- Defrag Tools – Perf View by Vance Morrison
- High Performance Coding with .NET Core and C# by Gergely Kalapos
- Defrag tools about CLR GC part 1 part 2 part 3 and part 4 with Maoni Stephens
On-Site Trainings
- .NET Performance and Debugging Workshop by SELA (Israel)
- .NET Performance by SELA (Israel)
- Asynchronous Computing and Composing Asynchronous and Event-Based by SELA (Israel)
- Parallel Programming with the TPL by SELA (Israel)
- Solid Async in .NET by Rock Solid Knowledge (UK)
- Mastering .NET Performance Tuning by Wintellect (USA)
- Mastering .NET Threading by Wintellect (USA)
Upcoming conferences
- 2021
- Dotnetos – .NET Performance World – Two-day conference dedicated solely to .NET performance! (05-06 October 2021, Online)
Conference talks
Sorted from newest to oldest:
- 2020
- Running .NET Core performance investigation on Linux by Adam Sitnik (20.11.2020, DotNext)
- What’s so hard about pinning? by Maoni Stephens, (28.09.2020, Dotnetos Conference)
- The Art of Tracing by Sebastian Solnica (01.10.2020, Dotnetos Conference)
- Performance Improvements in .NET 5 by Stephen Toub (02.10.2020, Dotnetos Conference)
- Beating CoreCLR’s own C++ code with CoreCLR 3.0 intrinsics by Dan Shechter (10.03.2020, DotNext)
- From ETW to EventPipe by Christophe Nasarre-Soulier (10.03.2020, DotNext)
- 2019
- What the game industry taught me about performance by Brian Rasmussen, (10.11.2019, Øredev)
- Compiling and Running a PHP on .NET Core by Jakub Míšek, (11.10.2019, Dotnetos Conference)
- Ethereum performance in .NET Core by Tomasz Stanczak, Piotr Gankiewicz, (11.10.2019, Dotnetos Conference)
- To ORM or not to ORM by Łukasz Dziekan, (11.10.2019, Dotnetos Conference)
- Writing Allocation Free Code in C# by Matt Ellis, (11.10.2019, Dotnetos Conference)
- Cliff diving into async in .NET Core and C# 8 by Daniel Marbach, (11.10.2019, Dotnetos Conference)
- Performance Testing by Andrey Akinshin, (10.10.2019, Dotnetos Conference)
- How Entity Framework translates LINQ all the way to SQL by Shay Rojansky, (10.10.2019, Dotnetos Conference)
- .NET Intrinsics in CoreCLR 3.0 by Dan Schechter, (10.10.2019, Dotnetos Conference)
- The .NET Garbage Collector by Peter Sollich, (10.10.2019, Dotnetos Conference)
- .NET Performance Investigation by Adam Sitnik, (10.10.2019, Dotnetos Conference)
- Performance in the .NET Runtime by Matt Warren, (10.10.2019, Dotnetos Conference)
- Spanification by Adam Sitnik (09.09.2019, Update Conference Prague)
- Debugging asynchronous scenarios in .NET by Kevin Gosse, Christophe Nasarre (16.08.2019, DotNext)
- Building your own profiling and diagnosis tools with Event Tracing for Windows by Pavel Yosifovich (16.08.2019, DotNext)
- JIT and AOT in the CLR by Mei-Chin Tsai (30.07.2019, JVM Language Summit)
- Powerful benchmarking in .NET by Adam Sitnik (09.07.2019, Update Conference Prague)
- What’s new for performance in .NET Core and ASP.NET Core 3.0 by Ben Adams (08.07.2019, .NET Core Summer Event)
- Ref struct, ref readonly struct, ref returning, ref everything! by Konrad Kokosa (04.06.2019, DotNext)
- Building responsive and scalable applications by Jeffrey Richter (26.03.2019, DotNext)
- Make your custom .NET GC — “whys” and “hows” by Konrad Kokosa (18.03.2019, DotNext)
- Extend the new WinDbg to build your own dream debugging tool by Kevin Gosse (18.03.2019, DotNext)
- Tuning a Runtime for Both Productivity and Performance by Mei-Chin Tsai (26.02.2019, QCon)
- 2018
- Efficient Buffer Manipulation using C# 7.2’s Span by Jeffrey Richter (28.11.2018, SPB .NET Meetup)
- Building your own debugging toolbox with ClrMD by Christophe Nasarre (28.11.2018, DotNext)
- Scratched metal by Federico Lois (26.10.2018, DotNext)
- PerfView: The Ultimate .NET Performance Tool by Sasha Goldshtein (27.08.2018, QCon)
- Advanced .NET debugging techniques from a real world investigation by Christophe Nasarre & Kevin Gosse (21.08.2018, DotNext)
- Patterns for high-performance C# by Federico Lois (08.02.2018, DotNext)
- 2017
- What’s new for performance in .NET Core 2.0 by Ben Adams (2017.11.09, CORESTART 2.0)
- State of the .NET Performance by Adam Sitnik (2017.07.05, NDC)
- Look Mommy, No GC! by Dina Goldshtein (2017.03.23, NDC)
- Squeezing the Hardware to Make Performance Juice by Sasha Goldshtein (2017.03.17, DotNext)
- Performance tuning Stack Overflow tags by Marco Cecconi (2017.03.17, DotNext)
- Multithreading Deep Dive by Gael Fraiteur (2017.03.17, DotNext)
- Stack Overflow — It’s all about performance! by Marco Cecconi (2017.03.17, DotNext)
- ETW — Monitor Anything, Anytime, Anywhere by Dina Goldshtein (2017.03.17, DotNext)
- Exceptional Exceptions in .NET by Adam Sitnik (2017.03.17, DotNext)
- 2016
- PerfView: Measure and Improve Your App’s Performance For Free by Sasha Goldshtein (2016.11.02, DotNext)
- The C++ and CLR Memory Models by Sasha Goldshtein (2016.11.02, DotNext)
- Safe Systems Programming in C# and .NET by Joe Duffy (2016.08.20, QCon)
- ASP.NET Core Kestrel: Adventures in building a fast web server by Damian Edwards & David Fowler (2016.08.12, NDC)
- Performance and How to Measure It by Matt Warren (2016.07.28, ProgSCon)
- Performance Optimizations in the Wild by Oren Eini (Ayende) (2016.06.23, NDC)
- The Vector in Your CPU: Exploiting SIMD for Superscalar Performance by Sasha Goldshtein (2016.04.19, DotNext)
- Lessons in Extreme .NET Performance by Ben Watson (2016.03.13, QCon)
- Older
- Making .NET applications faster by Sasha Goldshtein (2015.10.30, DevWeek)
- The zen of async: Best practices for best performance by Stephen Toub (2011.09.13, Build)
Blogs
- Maoni Stephens
- Stephen Toub
- Matt Warren
- Andrey Akinshin
- Dan Shechter
- Egor Bogatov
- Oren Eini aka Ayende
- Alexandre Mutel aka xoofx
- Vladimir Sadov
- Adam Sitnik
- Konrad Kokosa
- Kunal Pathak
Inspiring Open Source Contributors
- Ben Adams
- Jan Kotas
- Stephen Toub
- Kunal Pathak
- mikedn
- Tanner Gooding
- Vladimir Sadov
- Dan Shechter
- Egor Bogatov
- Federico Andres Lois
- Konrad Kokosa
- nietras
Performance tools
Benchmarking
- BenchmarkDotNet – Powerful .NET library for benchmarking.
- NBench – Cross-platform performance benchmarking and testing framework for .NET applications.
Profiling
- Prefix – Free lightweight profiler for ASP.NET apps shows everything your code is doing across 30+ common libraries
- MiniProfiler – Free profiling tool for .NET applications with Entity Framework and ASP.Net integration (Core supported for both versions)
- dotTrace – Paid profiler for .NET applications from the JetBrains team, included in the Resharper Ultimate package
- Unchase.FluentPerformanceMeter – Free open-source and cross-platform .Net Standard 2.0 library that is designed for the method’s performance measurement
- codetrack – Free .NET performance profiler and execution analyzer
Application Insights
- App Metrics – App Metrics is an open-source and cross-platform .NET library used to record and report metrics within an application and reports it’s health. See the docs for more details.
Analyzers
- Clr Heap Allocation Analyzer Clr Heap Allocation Analyzer is a Roslyn based Diagnostic Analyzer that is able to detect most allocations in code in the local method and bring them to your attention in Visual Studio.
Article series
Benchmarking
- Microbenchmark Design Guidelines by Adam Sitnik
- The Art of Benchmarking by Matt Warren
- Adventures in Benchmarking – Memory Allocations by Matt Warren
- Micro-Benchmarking Done Wrong, And For The Wrong Reasons by Sasha Goldshtein
- On ‘stackalloc’ Performance and The Large Object Heap by Sasha Goldshtein
- Micro-Benchmarking Considered Harmful by Sasha Goldshtein
- On Measuring Performance by Sasha Goldshtein
- Stopwatch under the hood by Andrey Akinshin
- DateTime under the hood by Andrey Akinshin
- Benchmarking made easy by Jon Skeet
- Simple microbenchmarking in C# by Jon Skeet
- Acquiring high-resolution time stamps
- Performance exercise: Minimum by Andrey Akinshin
- Performance exercise: Division by Andrey Akinshin
- Measuring Performance Improvements in .NET Core with BenchmarkDotNet (Part 1) by Andrey Akinshin
- AWS Lambda — Container Image .NET Benchmark by İren Saltalı
Monitoring
- Performance Counters Hell by Criteo Labs
- Replace .NET performance counters by CLR event tracing by Criteo Labs
- Grab ETW Session, Providers and Events by Criteo Labs
- Monitor Finalizers, contention and threads in your application by Criteo Labs
- In-process CLR event listeners with .NET Core 2.2 by Christophe Nasarre
- Spying on .NET Garbage Collector with TraceEvent by Christophe Nasarre
Investigations
- High-performance .NET by example: Filtering bot traffic by Alexandr Nikitin
- RyuJIT and the never-ending ThreadAbortException by Criteo Labs
- 9 posts about how to build your own toolbox with ClrMD by Criteo Labs
- .NET Threadpool starvation, and how queuing makes it worse by Criteo Labs
- Get-process-name challenge on a Friday afternoon by Christophe Nasarre
- In managed code we trust, our recent battles with the .NET Garbage Collector by Sam Saffron
Debugging performances series by Tess Ferrandez
- All .NET Debugging Demos: Hang, Crash, memory, and CPU
- Reader email: Need help troubleshooting perf/memory issues
- Debugging a classic ReaderWriterLock deadlock with SOSex.dll
- New commands in SOS for .NET 4.0 Part 1
- High CPU in .NET app using a static Generic.Dictionary
- .NET Hang Case study: The danger of locking on strings
- First step in troubleshooting complex issues: Define and scope your issue properly
- Show me the memory: Tool for visualizing virtual memory usage and GC heap usage.
- .NET Memory Leak reader email: Are you really “leaking” .net memory
- .NET Memory Leak: To dispose or not to dispose, that’s the 1 GB question
JIT Optimizations
- Loop alignment in .NET by Kunal Pathak
- RyuJIT Tutorial by Carol Eidt
- JIT Optimizations by Sasha Goldshtein
- JIT Optimizations, Inlining, and Interface Method Dispatching (Part 1 of N) by Sasha Goldshtein
- JIT Optimizations, Inlining, and Interface Method Dispatching (Part 2 of N) by Sasha Goldshtein
- Performance differences between debug and release builds by Hans Passant
- Aggressive Inlining in the CLR 4.5 JIT by Sasha Goldshtein
- Jit Optimizations: Inlining (I) by David Notario
- Jit Optimizations: Inlining (II) by David Notario
- More on inlining… by Eric Gunnerson
- To Inline or not to Inline: That is the question by Vance Morrison
- Some Notes on Using Machine Learning to Develop Inlining Heuristics by Andy Ayers
- The JIT does dead-code elimination in Debuggable code by Mkie Stall
- Does the JIT take advantage of my CPU? by David Notario
- Unrolling of small loops in different JIT versions by Andrey Akinshin
- RyuJIT CTP5 and loop unrolling by Andrey Akinshin
- RyuJIT RC and constant folding by Andrey Akinshin
- A story about JIT-x86 inlining and starg by Andrey Akinshin
- LegacyJIT-x86 and first method call by Andrey Akinshin
- Do PDB Files Affect Performance? by John Robbins
- What does the optimize switch do? by Eric Lippert
- Hoisting in .NET Explained (part 1) by Alexandr Nikitin
- Hoisting in .NET Examples (part 2) by Alexandr Nikitin
Refs
- ref returns are not pointers by Vladimir Sadov
- managed pointers by Vladimir Sadov
- Local variables cannot be returned by reference by Vladimir Sadov
- Safe to return rules for ref returns by Vladimir Sadov
- Why ref locals allow only a single binding? by Vladimir Sadov
- ref returns and locals by Adam Sitnik
Threading
- An Introduction to System.Threading.Channels by Stephen Toub
- ConfigureAwait FAQ by Stephen Toub
- Threading in C# by Joseph Albahari
Memory
- GC Perf Infrastructure – Part 1 by Maoni Stephens
- GC Perf Infrastructure – Part 0 by Maoni Stephens
- The history of the GC configs by Maoni Stephens
- Finalization implementation details by Maoni Stephens
- A portable way to get GC events in process and no admin privilege with 10 lines of code (and ability to dynamically enable/disable events) by Maoni Stephens
- Making CPU configuration better for GC on machines with > 64 CPUs by Maoni Stephens
- Running with Server GC in a Small Container Scenario Part 1 – Hard Limit for the GC Heap by Maoni Stephens
- Running with Server GC in a Small Container Scenario Part 0 by Maoni Stephens
- You Should Never See This Callstack in Production by Maoni Stephens
- Middle Ground between Server and Workstation GC by Maoni Stephens
- Pooling large arrays with ArrayPool by Adam Sitnik
- Value Types vs Reference Types by Adam Sitnik
- Span by Adam Sitnik
.NET CPU Intrinsics
- Vectorization using .NET APIs by Kunal Pathak
- Hardware Intrinsics in .NET Core by Tanner Gooding
- Exploring .NET Core platform intrinsics: Part 1 – Accelerating SHA-256 on ARMv8 by Nemanja Mijailovic
- Exploring .NET Core platform intrinsics: Part 2 – Accelerating AES encryption on ARMv8 by Nemanja Mijailovic
- Exploring .NET Core platform intrinsics: Part 3 – Viewing the code generated by the JIT by Nemanja Mijailovic
- Exploring .NET Core platform intrinsics: Part 4 – Alignment and pipelining by Nemanja Mijailovic
- .NET Core 3.0 Intrinsics in Real Life – 1/3 by damageboy
- .NET Core 3.0 Intrinsics in Real Life – 2/3 by damageboy
- .NET Core 3.0 Intrinsics in Real Life – 3/3 by damageboy
- Decimating Array.Sort with AVX2 – 1/∞ by damageboy
- Decimating Array.Sort with AVX2 – 2/∞ by damageboy
- Decimating Array.Sort with AVX2 – 3/∞ by damageboy
Performance Improvements in .NET Core
- Performance Improvements in .NET 6 by Stephen Toub
- Regex Performance Improvements in .NET 5 by Stephen Toub
- Performance Improvements in .NET 5 by Stephen Toub
- Performance Improvements in .NET Core 3.0 by Stephen Toub
- Performance Improvements in .NET Core 2.1 by Stephen Toub
- Performance Improvements in .NET Core by Stephen Toub
ARM64
- Arm64 Hardware Intrinsics APIs in .NET – Part 6 by Kunal Pathak
- Arm64 Hardware Intrinsics APIs in .NET – Part 5 by Kunal Pathak
- Arm64 Hardware Intrinsics APIs in .NET – Part 4 by Kunal Pathak
- Arm64 Hardware Intrinsics APIs in .NET – Part 3 by Kunal Pathak
- Arm64 Hardware Intrinsics APIs in .NET – Part 2 by Kunal Pathak
- Arm64 Hardware Intrinsics APIs in .NET – Part 1 by Kunal Pathak
- Peephole optimizations in .NET by Kunal Pathak
- Memory barriers in ARM64 by Kunal Pathak
- ARM64 performance of .Net Core 5 by Kunal Pathak
Leave a Reply