Steve Gordon

Turbocharged: Writing High-Performance C# and .NET Code

We took a file parsing operation from 7 GB of memory down to 250 MB. Learn the modern .NET I/O techniques that made it possible.

Turbocharged: Writing High-Performance C# and .NET Code
#1about 2 minutes

Defining performance metrics for .NET applications

Performance is defined by three key metrics: execution time, throughput, and memory allocations, which influence garbage collection frequency.

#2about 1 minute

Adopting a scientific approach to code optimization

Follow a simple, iterative cycle of measuring with data, optimizing a small part of the code, and then measuring again to validate improvements.

#3about 2 minutes

Choosing the right tools for performance measurement

Use tools like Visual Studio diagnostic tools for profiling and Benchmark.NET for precise micro-benchmarking of specific code paths.

#4about 2 minutes

Getting started with Benchmark.NET for micro-benchmarking

Benchmark.NET is an open-source library that provides high-precision measurements for small units of code by handling warm-up and statistical analysis.

#5about 3 minutes

Understanding Span<T> for efficient memory operations

Span<T> provides a type-safe, read/write view over a contiguous region of memory, such as arrays or stack-allocated memory, without new allocations.

#6about 4 minutes

Using Span<T> slicing to optimize array operations

Slicing a span creates a new view over a portion of the original data in constant time, avoiding the overhead of creating new arrays and copying data.

#7about 2 minutes

Parsing strings without allocations using ReadOnlySpan<char>

Create a `ReadOnlySpan<char>` from a string to parse it by slicing, which avoids creating new substring allocations and reduces memory pressure.

#8about 3 minutes

Navigating Span<T> limitations with Memory<T>

Since `Span<T>` is a stack-only `ref struct`, use the `Memory<T>` type in heap-based scenarios like async methods, then get a span from it when needed.

#9about 4 minutes

Case study: Optimizing S3 object key generation

A practical example shows how replacing string arrays and regex with `Span<T>` and stack allocation dramatically reduced memory allocations from 1KB to 192 bytes per operation.

#10about 2 minutes

Reusing temporary buffers with ArrayPool

Use `ArrayPool<T>` to rent and return temporary arrays, which reduces garbage collection pressure by reusing buffers instead of allocating new ones repeatedly.

#11about 2 minutes

Implementing high-performance I/O with System.IO.Pipelines

System.IO.Pipelines simplifies efficient stream processing by managing buffers from an `ArrayPool`, allowing you to work with data as it becomes available.

#12about 4 minutes

Case study: Parsing large files with pipelines

By replacing a library that loaded an entire file into memory with a pipeline-based parser, allocations were reduced from over 7.2 GB to 242 MB.

#13about 2 minutes

Making the business case for performance optimization

Translate performance gains like reduced allocations and increased throughput into monetary value, such as lower infrastructure costs, to get buy-in from stakeholders.

#14about 3 minutes

Summary of key principles for high-performance code

Always measure your code, focus on hot paths, avoid memory copies by using `Span<T>`, and consider `ArrayPool` and `Pipelines` for I/O-heavy scenarios.

#15about 4 minutes

Q&A: Span to array costs and using ValueTasks

The Q&A covers the cost of converting a span back to an array and discusses when to use `ValueTask` over `Task` to avoid allocations in synchronous completion paths.

Related jobs
Jobs that call for the skills explored in this talk.

Featured Partners

Related Articles

View all articles
BR
Benjamin Ruschin
What Developers Really Need to Create Great Code Demos
Every developer on earth has, at some point, had another developer to thank for a breakthrough, a success, an aha moment they wouldn’t have had without coming across that blog post, that open-source contribution, that reply on socials or that humble ...
What Developers Really Need to Create Great Code Demos
CH
Chris Heilmann
All the videos of Halfstack London 2024!
Last month was Halfstack London, a conference about the web, JavaScript and half a dozen other things. We were there to deliver a talk, but also to record all the sessions and we're happy to share them with you. It took a bit as we had to wait for th...
All the videos of Halfstack London 2024!
DC
Daniel Cranney
Dev Digest 159: AI Pipelines, 10x Faster TypeScript, How to Interview
Inside last week’s Dev Digest 159 . 🤖 How to use LLMs to help you write code ⚡ How much electricity does AI need? 🔒 Is your API secure? Learn all about hardening it… 🟦 TypeScript switches to go and gets 10 times faster 🖼️ An image cropper in your ap...
Dev Digest 159: AI Pipelines, 10x Faster TypeScript, How to Interview
CH
Chris Heilmann
Dev Digest 109 -Egg-citing things…
As we are heading into the Easter break, here are some things to spend some time on. There's resources on improving the performance of your code and you hear from the winners of CODE100 Amsterdam what it was like to be on stage. Also, hang tight as t...
Dev Digest 109 -Egg-citing things…

From learning to earning

Jobs that call for the skills explored in this talk.

Cloud Engineer (m/w/d)

Cloud Engineer (m/w/d)

fulfillmenttools
Köln, Germany

50-65K
Intermediate
TypeScript
Google Cloud Platform
Continuous Integration
Rust and GoLang

Rust and GoLang

NHe4a GmbH
Karlsruhe, Germany

Remote
55-65K
Intermediate
Senior
Go
Rust
Performance Tester - Contract

Performance Tester - Contract

Pixelcode Technologies Limited
Wellesbourne, United Kingdom

104K
API
JMeter
Performance Testing
Continuous Integration