Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
1.9k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Memory Management, C# 7.2 and Span<T>
A tour of .NET memory management, new C# features and Span
slang25
March 25, 2018
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
どうして今サーバーサイドKotlinを選択したのか
nealle
0
200
フルAIで個人開発して学んだあれこれ / yuruai vol.1
isaoshimizu
0
180
從觀望到全公司落地:AI Agentic Coding 導入實戰 — 流程整合與安全治理
appleboy
1
780
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
2
1.1k
証券システムを10年Scalaで作り続けるということ - 関数型まつり2026
krrrr38
1
360
ループエンジニアリングでE2Eテストを実践
noriyukitakei
0
270
SRE依存からの脱却 運用を開 発チームへ移す、 フルサイ クル開 発体制の実践
joooee0000
0
180
RAGの精度向上とエージェント活用
kintotechdev
2
130
AI時代における最適なQA組織の作り方
ymty
3
370
AWS Summit Japan 2026の振り返りと2027へ向けて / AWS Summit Japan 2026 Recap and Prospects for 2027
kaminashi
1
200
SRE歴2ヶ月でも開発6年の知見を活かして、チームで止まっていた環境改善を前に進めた話
a_ono
1
200
『AIに負けない』より『AIと遊ぶ』」〜ワクワクが最強のテスト・QA学習戦略_公開用
odan611
1
380
Featured
See All Featured
Ruling the World: When Life Gets Gamed
codingconduct
0
270
Building AI with AI
inesmontani
PRO
1
1.1k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Paper Plane
katiecoart
PRO
1
52k
Designing for Performance
lara
611
70k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
310
Navigating Weather and Climate Data
rabernat
0
270
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
330
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.6k
It's Worth the Effort
3n
188
29k
Facilitating Awesome Meetings
lara
57
7k
RailsConf 2023
tenderlove
30
1.5k
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