Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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.2k
Other Decks in Technology
See All in Technology
慶應義塾大学 AI実践05 論文執筆の仕組み化
keio_smilab
PRO
6
3.6k
なぜ東京にいる私が、新潟の技術コミュニティを運営するのか by 八雲慎之助
yakumo
0
220
PostgreSQL オプティマイザ統計の秘密
nori_shinoda
0
340
セキュリティ専任チームなしで攻撃を先回りするSREが実践したSIEM on Amazon OpenSearch Service
cscengineer
PRO
0
240
AWSを利用する上で知っておきたい名前解決の話 2026
nagisa53
4
2.3k
生き様としてのSRE
hokkai7go
1
170
AIエージェント統制はAPIから——押さえるべき5つの要素
nagix
0
120
Sizing, Benchmarking and Performance Tuning Apache Flink Clusters
rmetzger
0
110
Software Engineering in an AI-Driven World
erikjhordan_rey
0
120
AIコーディングはじめました
miso
0
150
Autonomous AI Lakehouse - Live AI Hubから始めるセキュアなAIデータ活用 -
oracle4engineer
PRO
3
190
2拠点SRE活動始めてみた | sogaoh's LT @ ホンマでっかSRE勉強会 #3
sogaoh
PRO
0
240
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
HDC tutorial
michielstock
2
1k
How GitHub (no longer) Works
holman
316
150k
Embracing the Ebb and Flow
colly
88
5.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Fireside Chat
paigeccino
43
4.1k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
290
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
70
68k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
590
Automating Front-end Workflow
addyosmani
1370
210k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
550
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