Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Memory Management, C# 7.2 and Span<T>
Search
slang25
March 25, 2018
Technology
2
1.9k
Memory Management, C# 7.2 and Span<T>
A tour of .NET memory management, new C# features and Span
slang25
March 25, 2018
Tweet
Share
More Decks by slang25
See All by slang25
Async in C# - The Good, the Bad and the Ugly
slang25
4
2.1k
Other Decks in Technology
See All in Technology
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
170
AI駆動開発における設計思想 認知負荷を下げるフロントエンドアーキテクチャ/ 20251211 Teppei Hanai
shift_evolve
PRO
2
440
Amazon Bedrock Knowledge Bases × メタデータ活用で実現する検証可能な RAG 設計
tomoaki25
6
1.4k
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
2
500
打 造 A I 驅 動 的 G i t H u b ⾃ 動 化 ⼯ 作 流 程
appleboy
0
370
今年のデータ・ML系アップデートと気になるアプデのご紹介
nayuts
1
570
障害対応訓練、その前に
coconala_engineer
0
140
Amazon Quick Suite で始める手軽な AI エージェント
shimy
1
1k
マイクロサービスへの5年間 ぶっちゃけ何をしてどうなったか
joker1007
17
7k
【U/Day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~
cygames
PRO
2
940
AI との良い付き合い方を僕らは誰も知らない
asei
0
170
AIBuildersDay_track_A_iidaxs
iidaxs
3
400
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Ethics towards AI in product and experience design
skipperchong
1
140
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
29
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
0
59
What's in a price? How to price your products and services
michaelherold
246
13k
Code Reviewing Like a Champion
maltzj
527
40k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
390
Embracing the Ebb and Flow
colly
88
4.9k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
Memory Management, C# 7.2 and Span<T>
HELLO! F# |> I ❤ 9 years of experience in
.NET Organiser of Bristol F# meetup and DDD South West You can find me at @stuartblang & http://stuartlang.uk
None
Rust
• FAST • SAFE • MAINTAINABLE Can C# have all
3?
C# as a high performance language
C# as a high performance language
Performance where it matters Fram eworks Libraries
Always Measure
Measure with... ▸ Memory Performance Counters ▸ BenchmarkDotNet ▸ dotMemory
▸ Visual Studio
How it works
None
None
“ The Stack Is An Implementation Detail. - Eric Lippert
Part One Part Two
Types ▸ Value types ▹ Structs ▹ Enums ▹ Bool
▹ Int, Float, Short, Long… ▹ Byte ▸ Reference types ▹ Class ▹ Interface ▹ Array ▹ String ▹ Delegate
Code Stack a=42 Stack x(ref) Heap object: array{1,2,3} sharplab.io demo
Code - behaviour
Stack Credit: http://www.i-programmer.info/ebooks/deep-c/363
Heap Small Object Heap Large Object Heap Gen 0 Gen
1 Gen 2
Heap Credit: https://www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/
Great Resource ▸ http://benhall.io/a-super-simplified-exp lanation-of-net-garbage-collection/
Stack vs Heap What? Lifetime When disposed? Time to dispose
Stack Local values Local references (just the ref part) Stack frame Deterministic Constant (near instant) Heap Reference object instances Unrestricted GC non-deterministic It depends (non-trivial)
Watch out for hidden allocations ▸ Let’s see some examples
Watch out for hidden allocations
Watch out for hidden allocations
Watch out for hidden allocations
Watch out for hidden allocations
Plugins ▸ R# Heap Allocations Viewer ▸ Roslyn Clr Heap
Allocation Analyzer
None
In Parameters
In Parameters - cont. ▸ Essentially readonly ref ▸ Where
you want to want to pass by-ref for performance, with the safety and behaviour or by-value ▸ Watch out for copying with invoking methods on non-readonly structs
Ref extension methods
Ref locals ▸ Reference semantics with value types
Ref locals ▸ Can be thought of as aliases
Ref returns
Ref Struct ▸ Aka ref-like ▸ Stack-only! ▸ To support
Span<T>
Ref Struct
“ The great Eric Lippert once wrote “The Stack Is
An Implementation Detail”, and basically that’s not true anymore. - Jon Skeet
Span<T> ▸ Abstraction over arbitrary memory Span<T> Marshal.AllocHGlobal() stackalloc []
new []
Span<T>
Span<T>
Span<T> - Why stack-only? ▸ Safe lifetime - cannot outlive
stack memory ▸ Safe concurrency - No struct tearing ▸ It’s fast!
Span<T> - Other properties ▸ Efficient representation ▸ GC tracking
- refs will be maintained by GC
Use Cases ▸ Alternative to unsafe code ▸ Parsing text
▸ Sharing partial parts of memory
Problem with pointers ▸ Requires GC pinning (for heap memory)
▸ Mustn’t escape pointer (for stack) ▸ No bounds checking ▸ Unsafe code blocks
Problem with pointers
Credit: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/stackalloc
None
You can still pin
You can still pin - in C# 7.3
BenchmarkDotNet
None
None
Results
C# 8 - Slicing with Ranges demo
None
None
Span<T> Framework APIs netstandard2.0 ❌ netstandard2.1 ✅ Today Next netcoreapp2.1
✅ netcoreapp2.0 ❌ netcoreapp2.2 ✅ netcoreapp2.3 ✅ netcoreapp3.0 ✅ net472 ❌ net48 ❌ net49 ❓ ❓
Related topics ▸ ReadOnlySpan<T> ▸ Memory<T> & ReadOnlyMemory<T> ▸ System.Runtime.CompilerServices.Unsafe
▸ MemoryMarshal.AsBytes(span) ▸ MemoryMarshal.Cast<TFrom,TTo>(span)
Libraries using Span<T> (just some) ▸ Utf8Json ▸ SpanJson ▸
ZeroFormatter ▸ StackExchange.Redis
Case study JustEat.StatsD PRs Low hanging fruit: #55, #59, #63,
#65 Master class by dv00d00: #104 - Zero Allocations
Good Reads ▸ Adam Sitnik - Span ▸ Marc Gravell
- Spans and ref Parts 1 & 2 ▸ Span<T> spec ▸ Vladimir Sadov ▸ All About Span: Exploring a New .NET Mainstay - Stephen Toub ▸ Maarten Balliauw
Summary
THANKS! Any questions? You can find me at @stuartblang