SlideShare a Scribd company logo
State of the
.NET Performance
Adam Sitnik
About myself
Work:
• Energy trading (.NET Core)
• Energy Production Optimization
• Balance Settlement
• Critical Events Detection
Open Source:
• BenchmarkDotNet (.NET Core)
• Core CLR (Spans)
• corefxlab (optimizations)
• & more
2
Agenda
• C# 7
• ValueTuple
• ref returns and locals
• .NET Core
• Span (Slice)
• ArrayPool
• ValueTask
• Pipelines (Channels)
• Unsafe
• Supported frameworks
• Questions
3
ValueTuple: sample
4
(double min, double max, double avg, double sum) GetStats(double[] numbers)
{
double min = double.MaxValue, max = double.MinValue, sum = 0;
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] > max) max = numbers[i];
if (numbers[i] < min) min = numbers[i];
sum += numbers[i];
}
double avg = numbers.Length != 0 ? sum / numbers.Length : double.NaN;
return (min, max, avg, sum);
}
ValueTuple
5
• Tuple which is Value Type:
• less space
• better data locality
• NO GC
• deterministic deallocation for stack-allocated Value Types
You need reference to System.ValueTuple.dll
Value Types: the disadvantages?!
• Are expensive to copy!
• You need to study CIL and profiles to find out when it happens!
int result = readOnlyStructField.Method();
is converted to:
var copy = readOnlyStruct;
int result = copy.Method();
6
ref returns and locals: sample
7
ref int Max(
ref int first, ref int second, ref int third)
{
ref int max = ref first;
if (first < second) max = second;
if (second < third) max = third;
return ref max;
}
ref locals: Benchmarks: initialization
public void ByValue() {
for (int i = 0; i < array.Length; i++) {
BigStruct value = array[i];
value.Int1 = 1;
value.Int2 = 2;
value.Int3 = 3;
value.Int4 = 4;
value.Int5 = 5;
array[i] = value;
}
}
public void ByReference(){
for (int i = 0; i < array.Length; i++) {
ref BigStruct reference = ref array[i];
reference.Int1 = 1;
reference.Int2 = 2;
reference.Int3 = 3;
reference.Int4 = 4;
reference.Int5 = 5;
}
}
8
struct BigStruct { public int Int1, Int2, Int3, Int4, Int5; }
Benchmark
results
9
How can old JITs
support it?
What about unsafe?!
void ByReferenceUnsafeExplicitExtraMethod()
{
unsafe
{
fixed (BigStruct* pinned = array)
{
for (int i = 0;
i < array.Length; i++)
{
Init(&pinned[i]);
}
}
}
}
unsafe void Init(BigStruct* pointer)
{
(*pointer).Int1 = 1;
(*pointer).Int2 = 2;
(*pointer).Int3 = 3;
(*pointer).Int4 = 4;
(*pointer).Int5 = 5;
}
10
Safe vs Unsafe with RyuJit
Method Jit Mean Scaled
ByValue RyuJit 742.4910 ns 4.56
ByReference RyuJit 162.8368 ns 1.00
ByReferenceOldWay RyuJit 170.0255 ns 1.04
ByReferenceUnsafeImplicit RyuJit 201.4584 ns 1.24
ByReferenceUnsafeExplicit RyuJit 200.7698 ns 1.23
ByReferenceUnsafeExplicitExtraMethod RyuJit 171.3973 ns 1.05
11
Executing Unsafe code requires full trust. It can be a „no go” for Cloud!
No need for pinning!
Stackalloc is
the fastest
way to
allocate small
chunks of
memory in
.NET
12
13
Allocation Deallocation Usage
Managed < 85 KB Very cheap
(NextObjPtr)
• non-deterministic
• Expensive!
• GC: stop the world • Very easy
• Common
• Safe
Managed: LOH Acceptable cost
(free list
management)
The same as above &:
• Fragmentation (LOH)
• LOH = Gen 2 = Full GC
Native:
Stackalloc
Very cheap • Deterministic
• Very cheap • Unsafe
• Not
common
• Limited
Native: Marshal Acceptable cost
(free list
management)
• Deterministic
• Very cheap
• On demand
Span (Slice)
It provides a uniform API for working with:
• Unmanaged memory buffers
• Arrays and subarrays
• Strings and substrings
It’s fully type-safe and memory-safe.
Almost no overhead.
It’s a Value Type.
15
Supports any memory
byte* pointerToStack = stackalloc byte[256];
Span<byte> stackMemory = new Span<byte>(pointerToStack, 256);
Span<byte> stackMemory = stackalloc byte[256]; // C# 8.0?
IntPtr unmanagedHandle = Marshal.AllocHGlobal(256);
Span<byte> unmanaged = new Span<byte>(unmanagedHandle.ToPointer(), 256);
Span<byte> unmanaged = Marshal.AllocHGlobal(256); // C# 8.0?
char[] array = new char[] { 'D', 'O', 'T', ' ', 'N', 'E', 'X', 'T' };
Span<char> fromArray = new Span<char>(array);
16
Single method in the API is enough
unsafe void Handle(byte* buffer, int length) { }
void Handle(byte[] buffer) { }
void Handle(Span<T> buffer) { }
17
Uniform access to any kind of contiguous memory
public void Enumeration<T>(Span<T> buffer)
{
for (int i = 0; i < buffer.Length; i++)
{
Use(buffer[i]);
}
foreach (T item in buffer)
{
Use(item);
}
}
18
Span for new runtimes
• CoreCLR 1.2
• CLR 4.6.3? 4.6.4?
19
Span for existing runtimes
20
.NET 4.5+, .NET Standard 1.0
Make subslices without allocations
ReadOnlySpan<char> subslice =
".NET Core: Performance Storm!"
.Slice(start: 0, length: 9);
21
22
Subslice
benchmarks
Possible usages
• Formatting
• Base64/Unicode encoding
• HTTP Parsing/Writing
• Compression/Decompression
• XML/JSON parsing/writing
• Binary reading/writing
• & more!!
23
GC Pauses
24
.NET Managed Heap*
25
G
e
n
0
G
e
n
1
Gen 2 LOH
* - simplified, Workstation mode or view per logical processor in Server mode
FULL GC
ArrayPool
• System.Buffers package
• Provides a resource pool that enables reusing instances of T[]
• Arrays allocated on managed heap with new operator
• The default maximum length of each array in the pool is 2^20
(1024*1024 = 1 048 576)
26
ArrayPool: Sample
var pool = ArrayPool<byte>.Shared;
byte[] buffer = pool.Rent(minLength);
try
{
Use(buffer);
}
finally
{
pool.Return(buffer);
}
27
10 KB
29
1 MB
30
1 MB
31
Method Median StdDev Scaled Delta Gen 0 Gen 1 Gen 2
stackalloc 51,689.8611 ns 3,343.26 ns 3.76 275.9% - - -
New 13,750.9839 ns 974.0229 ns 1.00 Baseline - - 23 935
NativePool.Shared 186.1173 ns 12.6833 ns 0.01 -98.6% - - -
ArrayPool.Shared 61.4539 ns 3.4862 ns 0.00 -99.6% - - -
SizeAware 54.5332 ns 2.1022 ns 0.00 -99.6% - - -
32
10 MB
Async on hotpath
Task<T> SmallMethodExecutedVeryVeryOften()
{
if(CanRunSynchronously()) // true most of the time
{
return Task.FromResult(ExecuteSynchronous());
}
return ExecuteAsync();
}
33
Async on hotpath: consuming method
while (true)
{
var result = await SmallMethodExecutedVeryVeryOften();
Use(result);
}
34
ValueTask<T>: the idea
• Wraps a TResult and Task<TResult>, only one of which is used
• It should not replace Task, but help in some scenarios when:
• method returns Task<TResult>
• and very frequently returns synchronously (fast)
• and is invoked so often that cost of allocation of
Task<TResult> is a problem
37
Sample implementation of ValueTask usage
ValueTask<T> SampleUsage()
{
if (IsFastSynchronousExecutionPossible())
{
return ExecuteSynchronous(); // INLINEABLE!!!
}
return new ValueTask<T>(ExecuteAsync());
}
T ExecuteSynchronous() { }
Task<T> ExecuteAsync() { }
38
How to consume ValueTask
var valueTask = SampleUsage(); // INLINEABLE
if(valueTask.IsCompleted)
{
Use(valueTask.Result);
}
else
{
Use(await valueTask.AsTask()); // NO INLINING
}
39
ValueTask<T>: usage && gains
• Sample usage:
• Sockets (already used in ASP.NET Core)
• File Streams
• ADO.NET Data readers
• Gains:
• Less heap allocations
• Method inlining is possible!
• Facts
• Skynet 146ns for Task, 16ns for ValueTask
• Tech Empower (Plaintext) +2.6%
40
ValueTask
vs
Task:
Creation
41
Web Request
42
Pipelines (Channels)
• „ high performance zero-copy buffer-pool-managed asynchronous message
pipes” – Marc Gravell from Stack Overflow
• Pipeline pushes data to you rather than having you pull.
• When writing to a pipeline, the caller allocates memory from the pipeline
directly.
• No new memory is allocated. Only pooled memory buffer is used.
43
Simplified Flow
Asks for a memory buffer.
Writes the data to the buffer.
Returns pooled memory.
Starts awaiting for the data.
Reads the data from buffer.
Uses low-allocating Span based
apis (parsing etc).
Returns the memory to the pool
when done.
44
System.Runtime.CompilerServices.Unsafe
T As<T>(object o) where T : class;
void* AsPointer<T>(ref T value);
void Copy<T>(void* destination, ref T source);
void Copy<T>(ref T destination, void* source);
void CopyBlock(void* destination, void* source, uint byteCount);
void InitBlock(void* startAddress, byte value, uint byteCount);
T Read<T>(void* source);
int SizeOf<T>();
void Write<T>(void* destination, T value);
45
Supported frameworks
46
Package name .NET
Standard
.NET
Framework
Release Nuget feed
System.Slices 1.0 4.5 1.2? Clr/fxlab
System.Buffers 1.1 4.5.1 1.0 nuget.org
System.Threading.Task.Extensions 1.0 4.5 1.0 nuget.org
System.Runtime.CompilerServices.Unsafe 1.0 4.5 1.0 corefx
Questions?
Contact:
@SitnikAdam
Adam.Sitnik@gmail.com
You can find the benchmarks at
https://github.com/adamsitnik/DotNetCorePerformance
https://github.com/adamsitnik/CSharpSevenBenchmarks
Ad

More Related Content

What's hot (20)

Node.js Event Loop & EventEmitter
Node.js Event Loop & EventEmitterNode.js Event Loop & EventEmitter
Node.js Event Loop & EventEmitter
Simen Li
 
Understanding greenlet
Understanding greenletUnderstanding greenlet
Understanding greenlet
Saúl Ibarra Corretgé
 
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Anne Nicolas
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js Module
Fred Chien
 
Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)
Alexey Fyodorov
 
Dev Day 2019: Mike Sperber – Software Design für die Seele
Dev Day 2019: Mike Sperber – Software Design für die SeeleDev Day 2019: Mike Sperber – Software Design für die Seele
Dev Day 2019: Mike Sperber – Software Design für die Seele
DevDay Dresden
 
Introduzione al TDD
Introduzione al TDDIntroduzione al TDD
Introduzione al TDD
Andrea Francia
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJava
Kros Huang
 
TensorFlow XLA RPC
TensorFlow XLA RPCTensorFlow XLA RPC
TensorFlow XLA RPC
Mr. Vengineer
 
Code lifecycle in the jvm - TopConf Linz
Code lifecycle in the jvm - TopConf LinzCode lifecycle in the jvm - TopConf Linz
Code lifecycle in the jvm - TopConf Linz
Ivan Krylov
 
Intro To Spring Python
Intro To Spring PythonIntro To Spring Python
Intro To Spring Python
gturnquist
 
Pharo Optimising JIT Internals
Pharo Optimising JIT InternalsPharo Optimising JIT Internals
Pharo Optimising JIT Internals
ESUG
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
Ivan Krylov
 
Twins: OOP and FP
Twins: OOP and FPTwins: OOP and FP
Twins: OOP and FP
RichardWarburton
 
Functional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event SystemsFunctional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event Systems
Leonardo Borges
 
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
Mr. Vengineer
 
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Victoria Schiffer
 
Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)
Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)
Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)
mahesh madushanka
 
Event loop
Event loopEvent loop
Event loop
codepitbull
 
Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations
DVClub
 
Node.js Event Loop & EventEmitter
Node.js Event Loop & EventEmitterNode.js Event Loop & EventEmitter
Node.js Event Loop & EventEmitter
Simen Li
 
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Anne Nicolas
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js Module
Fred Chien
 
Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)
Alexey Fyodorov
 
Dev Day 2019: Mike Sperber – Software Design für die Seele
Dev Day 2019: Mike Sperber – Software Design für die SeeleDev Day 2019: Mike Sperber – Software Design für die Seele
Dev Day 2019: Mike Sperber – Software Design für die Seele
DevDay Dresden
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJava
Kros Huang
 
Code lifecycle in the jvm - TopConf Linz
Code lifecycle in the jvm - TopConf LinzCode lifecycle in the jvm - TopConf Linz
Code lifecycle in the jvm - TopConf Linz
Ivan Krylov
 
Intro To Spring Python
Intro To Spring PythonIntro To Spring Python
Intro To Spring Python
gturnquist
 
Pharo Optimising JIT Internals
Pharo Optimising JIT InternalsPharo Optimising JIT Internals
Pharo Optimising JIT Internals
ESUG
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
Ivan Krylov
 
Functional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event SystemsFunctional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event Systems
Leonardo Borges
 
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2  「エッジAIモダン計測制御の世界」オ...
Google Edge TPUで TensorFlow Liteを使った時に 何をやっているのかを妄想してみる 2 「エッジAIモダン計測制御の世界」オ...
Mr. Vengineer
 
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Victoria Schiffer
 
Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)
Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)
Real Time Analytics - Stream Processing (Colombo big data meetup 18/05/2017)
mahesh madushanka
 
Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations
DVClub
 

Viewers also liked (11)

Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Yulia Tsisyk
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Yulia Tsisyk
 
Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»
Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»
Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»
Yulia Tsisyk
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Yulia Tsisyk
 
Яков Повар "Системы обмена сообщениями на примере MassTransit"
Яков Повар "Системы обмена сообщениями на примере MassTransit"Яков Повар "Системы обмена сообщениями на примере MassTransit"
Яков Повар "Системы обмена сообщениями на примере MassTransit"
Yulia Tsisyk
 
Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"
Yulia Tsisyk
 
Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»
Yulia Tsisyk
 
Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений» Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»
Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
Yulia Tsisyk
 
Mobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigitalMobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigital
Aleyda Solís
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
Luminary Labs
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Yulia Tsisyk
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Yulia Tsisyk
 
Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»
Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»
Вячеслав Михайлов «Как сделать Single Sign-On в веб-приложении в 10 строк кода»
Yulia Tsisyk
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Yulia Tsisyk
 
Яков Повар "Системы обмена сообщениями на примере MassTransit"
Яков Повар "Системы обмена сообщениями на примере MassTransit"Яков Повар "Системы обмена сообщениями на примере MassTransit"
Яков Повар "Системы обмена сообщениями на примере MassTransit"
Yulia Tsisyk
 
Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"
Yulia Tsisyk
 
Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»
Yulia Tsisyk
 
Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений» Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»
Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
Yulia Tsisyk
 
Mobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigitalMobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigital
Aleyda Solís
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
Luminary Labs
 
Ad

Similar to Adam Sitnik "State of the .NET Performance" (20)

A (brief) overview of Span<T>
A (brief) overview of Span<T>A (brief) overview of Span<T>
A (brief) overview of Span<T>
David Wengier
 
Task and Data Parallelism
Task and Data ParallelismTask and Data Parallelism
Task and Data Parallelism
Sasha Goldshtein
 
C# - What's next
C# - What's nextC# - What's next
C# - What's next
Christian Nagel
 
Where the wild things are - Benchmarking and Micro-Optimisations
Where the wild things are - Benchmarking and Micro-OptimisationsWhere the wild things are - Benchmarking and Micro-Optimisations
Where the wild things are - Benchmarking and Micro-Optimisations
Matt Warren
 
"Optimization of a .NET application- is it simple ! / ?", Yevhen Tatarynov
"Optimization of a .NET application- is it simple ! / ?",  Yevhen Tatarynov"Optimization of a .NET application- is it simple ! / ?",  Yevhen Tatarynov
"Optimization of a .NET application- is it simple ! / ?", Yevhen Tatarynov
Fwdays
 
Look Mommy, No GC! (TechDays NL 2017)
Look Mommy, No GC! (TechDays NL 2017)Look Mommy, No GC! (TechDays NL 2017)
Look Mommy, No GC! (TechDays NL 2017)
Dina Goldshtein
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
Ynon Perek
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF Observability
Brendan Gregg
 
.NET Multithreading/Multitasking
.NET Multithreading/Multitasking.NET Multithreading/Multitasking
.NET Multithreading/Multitasking
Sasha Kravchuk
 
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
Cyber Security Alliance
 
Fedor Polyakov - Optimizing computer vision problems on mobile platforms
Fedor Polyakov - Optimizing computer vision problems on mobile platforms Fedor Polyakov - Optimizing computer vision problems on mobile platforms
Fedor Polyakov - Optimizing computer vision problems on mobile platforms
Eastern European Computer Vision Conference
 
C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8
Christian Nagel
 
Kapacitor - Real Time Data Processing Engine
Kapacitor - Real Time Data Processing EngineKapacitor - Real Time Data Processing Engine
Kapacitor - Real Time Data Processing Engine
Prashant Vats
 
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen TatarynovWorkshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Fwdays
 
Getting started cpp full
Getting started cpp   fullGetting started cpp   full
Getting started cpp full
Võ Hòa
 
Story of static code analyzer development
Story of static code analyzer developmentStory of static code analyzer development
Story of static code analyzer development
Andrey Karpov
 
Golang dot-testing-lite
Golang dot-testing-liteGolang dot-testing-lite
Golang dot-testing-lite
Richárd Kovács
 
Tamir Dresher - DotNet 7 What's new.pptx
Tamir Dresher - DotNet 7 What's new.pptxTamir Dresher - DotNet 7 What's new.pptx
Tamir Dresher - DotNet 7 What's new.pptx
Tamir Dresher
 
Blazing Fast Windows 8 Apps using Visual C++
Blazing Fast Windows 8 Apps using Visual C++Blazing Fast Windows 8 Apps using Visual C++
Blazing Fast Windows 8 Apps using Visual C++
Microsoft Developer Network (MSDN) - Belgium and Luxembourg
 
Tools and Techniques for Understanding Threading Behavior in Android
Tools and Techniques for Understanding Threading Behavior in AndroidTools and Techniques for Understanding Threading Behavior in Android
Tools and Techniques for Understanding Threading Behavior in Android
Intel® Software
 
A (brief) overview of Span<T>
A (brief) overview of Span<T>A (brief) overview of Span<T>
A (brief) overview of Span<T>
David Wengier
 
Where the wild things are - Benchmarking and Micro-Optimisations
Where the wild things are - Benchmarking and Micro-OptimisationsWhere the wild things are - Benchmarking and Micro-Optimisations
Where the wild things are - Benchmarking and Micro-Optimisations
Matt Warren
 
"Optimization of a .NET application- is it simple ! / ?", Yevhen Tatarynov
"Optimization of a .NET application- is it simple ! / ?",  Yevhen Tatarynov"Optimization of a .NET application- is it simple ! / ?",  Yevhen Tatarynov
"Optimization of a .NET application- is it simple ! / ?", Yevhen Tatarynov
Fwdays
 
Look Mommy, No GC! (TechDays NL 2017)
Look Mommy, No GC! (TechDays NL 2017)Look Mommy, No GC! (TechDays NL 2017)
Look Mommy, No GC! (TechDays NL 2017)
Dina Goldshtein
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
Ynon Perek
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF Observability
Brendan Gregg
 
.NET Multithreading/Multitasking
.NET Multithreading/Multitasking.NET Multithreading/Multitasking
.NET Multithreading/Multitasking
Sasha Kravchuk
 
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
Cyber Security Alliance
 
C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8
Christian Nagel
 
Kapacitor - Real Time Data Processing Engine
Kapacitor - Real Time Data Processing EngineKapacitor - Real Time Data Processing Engine
Kapacitor - Real Time Data Processing Engine
Prashant Vats
 
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen TatarynovWorkshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Fwdays
 
Getting started cpp full
Getting started cpp   fullGetting started cpp   full
Getting started cpp full
Võ Hòa
 
Story of static code analyzer development
Story of static code analyzer developmentStory of static code analyzer development
Story of static code analyzer development
Andrey Karpov
 
Tamir Dresher - DotNet 7 What's new.pptx
Tamir Dresher - DotNet 7 What's new.pptxTamir Dresher - DotNet 7 What's new.pptx
Tamir Dresher - DotNet 7 What's new.pptx
Tamir Dresher
 
Tools and Techniques for Understanding Threading Behavior in Android
Tools and Techniques for Understanding Threading Behavior in AndroidTools and Techniques for Understanding Threading Behavior in Android
Tools and Techniques for Understanding Threading Behavior in Android
Intel® Software
 
Ad

Recently uploaded (20)

AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?
Daniel Lehner
 
Rusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond SparkRusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond Spark
carlyakerly1
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded DevelopersLinux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Toradex
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?
Daniel Lehner
 
Rusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond SparkRusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond Spark
carlyakerly1
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded DevelopersLinux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Toradex
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 

Adam Sitnik "State of the .NET Performance"

  • 1. State of the .NET Performance Adam Sitnik
  • 2. About myself Work: • Energy trading (.NET Core) • Energy Production Optimization • Balance Settlement • Critical Events Detection Open Source: • BenchmarkDotNet (.NET Core) • Core CLR (Spans) • corefxlab (optimizations) • & more 2
  • 3. Agenda • C# 7 • ValueTuple • ref returns and locals • .NET Core • Span (Slice) • ArrayPool • ValueTask • Pipelines (Channels) • Unsafe • Supported frameworks • Questions 3
  • 4. ValueTuple: sample 4 (double min, double max, double avg, double sum) GetStats(double[] numbers) { double min = double.MaxValue, max = double.MinValue, sum = 0; for (int i = 0; i < numbers.Length; i++) { if (numbers[i] > max) max = numbers[i]; if (numbers[i] < min) min = numbers[i]; sum += numbers[i]; } double avg = numbers.Length != 0 ? sum / numbers.Length : double.NaN; return (min, max, avg, sum); }
  • 5. ValueTuple 5 • Tuple which is Value Type: • less space • better data locality • NO GC • deterministic deallocation for stack-allocated Value Types You need reference to System.ValueTuple.dll
  • 6. Value Types: the disadvantages?! • Are expensive to copy! • You need to study CIL and profiles to find out when it happens! int result = readOnlyStructField.Method(); is converted to: var copy = readOnlyStruct; int result = copy.Method(); 6
  • 7. ref returns and locals: sample 7 ref int Max( ref int first, ref int second, ref int third) { ref int max = ref first; if (first < second) max = second; if (second < third) max = third; return ref max; }
  • 8. ref locals: Benchmarks: initialization public void ByValue() { for (int i = 0; i < array.Length; i++) { BigStruct value = array[i]; value.Int1 = 1; value.Int2 = 2; value.Int3 = 3; value.Int4 = 4; value.Int5 = 5; array[i] = value; } } public void ByReference(){ for (int i = 0; i < array.Length; i++) { ref BigStruct reference = ref array[i]; reference.Int1 = 1; reference.Int2 = 2; reference.Int3 = 3; reference.Int4 = 4; reference.Int5 = 5; } } 8 struct BigStruct { public int Int1, Int2, Int3, Int4, Int5; }
  • 10. What about unsafe?! void ByReferenceUnsafeExplicitExtraMethod() { unsafe { fixed (BigStruct* pinned = array) { for (int i = 0; i < array.Length; i++) { Init(&pinned[i]); } } } } unsafe void Init(BigStruct* pointer) { (*pointer).Int1 = 1; (*pointer).Int2 = 2; (*pointer).Int3 = 3; (*pointer).Int4 = 4; (*pointer).Int5 = 5; } 10
  • 11. Safe vs Unsafe with RyuJit Method Jit Mean Scaled ByValue RyuJit 742.4910 ns 4.56 ByReference RyuJit 162.8368 ns 1.00 ByReferenceOldWay RyuJit 170.0255 ns 1.04 ByReferenceUnsafeImplicit RyuJit 201.4584 ns 1.24 ByReferenceUnsafeExplicit RyuJit 200.7698 ns 1.23 ByReferenceUnsafeExplicitExtraMethod RyuJit 171.3973 ns 1.05 11 Executing Unsafe code requires full trust. It can be a „no go” for Cloud! No need for pinning!
  • 12. Stackalloc is the fastest way to allocate small chunks of memory in .NET 12
  • 13. 13 Allocation Deallocation Usage Managed < 85 KB Very cheap (NextObjPtr) • non-deterministic • Expensive! • GC: stop the world • Very easy • Common • Safe Managed: LOH Acceptable cost (free list management) The same as above &: • Fragmentation (LOH) • LOH = Gen 2 = Full GC Native: Stackalloc Very cheap • Deterministic • Very cheap • Unsafe • Not common • Limited Native: Marshal Acceptable cost (free list management) • Deterministic • Very cheap • On demand
  • 14. Span (Slice) It provides a uniform API for working with: • Unmanaged memory buffers • Arrays and subarrays • Strings and substrings It’s fully type-safe and memory-safe. Almost no overhead. It’s a Value Type. 15
  • 15. Supports any memory byte* pointerToStack = stackalloc byte[256]; Span<byte> stackMemory = new Span<byte>(pointerToStack, 256); Span<byte> stackMemory = stackalloc byte[256]; // C# 8.0? IntPtr unmanagedHandle = Marshal.AllocHGlobal(256); Span<byte> unmanaged = new Span<byte>(unmanagedHandle.ToPointer(), 256); Span<byte> unmanaged = Marshal.AllocHGlobal(256); // C# 8.0? char[] array = new char[] { 'D', 'O', 'T', ' ', 'N', 'E', 'X', 'T' }; Span<char> fromArray = new Span<char>(array); 16
  • 16. Single method in the API is enough unsafe void Handle(byte* buffer, int length) { } void Handle(byte[] buffer) { } void Handle(Span<T> buffer) { } 17
  • 17. Uniform access to any kind of contiguous memory public void Enumeration<T>(Span<T> buffer) { for (int i = 0; i < buffer.Length; i++) { Use(buffer[i]); } foreach (T item in buffer) { Use(item); } } 18
  • 18. Span for new runtimes • CoreCLR 1.2 • CLR 4.6.3? 4.6.4? 19
  • 19. Span for existing runtimes 20 .NET 4.5+, .NET Standard 1.0
  • 20. Make subslices without allocations ReadOnlySpan<char> subslice = ".NET Core: Performance Storm!" .Slice(start: 0, length: 9); 21
  • 22. Possible usages • Formatting • Base64/Unicode encoding • HTTP Parsing/Writing • Compression/Decompression • XML/JSON parsing/writing • Binary reading/writing • & more!! 23
  • 24. .NET Managed Heap* 25 G e n 0 G e n 1 Gen 2 LOH * - simplified, Workstation mode or view per logical processor in Server mode FULL GC
  • 25. ArrayPool • System.Buffers package • Provides a resource pool that enables reusing instances of T[] • Arrays allocated on managed heap with new operator • The default maximum length of each array in the pool is 2^20 (1024*1024 = 1 048 576) 26
  • 26. ArrayPool: Sample var pool = ArrayPool<byte>.Shared; byte[] buffer = pool.Rent(minLength); try { Use(buffer); } finally { pool.Return(buffer); } 27
  • 29. 1 MB 31 Method Median StdDev Scaled Delta Gen 0 Gen 1 Gen 2 stackalloc 51,689.8611 ns 3,343.26 ns 3.76 275.9% - - - New 13,750.9839 ns 974.0229 ns 1.00 Baseline - - 23 935 NativePool.Shared 186.1173 ns 12.6833 ns 0.01 -98.6% - - - ArrayPool.Shared 61.4539 ns 3.4862 ns 0.00 -99.6% - - - SizeAware 54.5332 ns 2.1022 ns 0.00 -99.6% - - -
  • 31. Async on hotpath Task<T> SmallMethodExecutedVeryVeryOften() { if(CanRunSynchronously()) // true most of the time { return Task.FromResult(ExecuteSynchronous()); } return ExecuteAsync(); } 33
  • 32. Async on hotpath: consuming method while (true) { var result = await SmallMethodExecutedVeryVeryOften(); Use(result); } 34
  • 33. ValueTask<T>: the idea • Wraps a TResult and Task<TResult>, only one of which is used • It should not replace Task, but help in some scenarios when: • method returns Task<TResult> • and very frequently returns synchronously (fast) • and is invoked so often that cost of allocation of Task<TResult> is a problem 37
  • 34. Sample implementation of ValueTask usage ValueTask<T> SampleUsage() { if (IsFastSynchronousExecutionPossible()) { return ExecuteSynchronous(); // INLINEABLE!!! } return new ValueTask<T>(ExecuteAsync()); } T ExecuteSynchronous() { } Task<T> ExecuteAsync() { } 38
  • 35. How to consume ValueTask var valueTask = SampleUsage(); // INLINEABLE if(valueTask.IsCompleted) { Use(valueTask.Result); } else { Use(await valueTask.AsTask()); // NO INLINING } 39
  • 36. ValueTask<T>: usage && gains • Sample usage: • Sockets (already used in ASP.NET Core) • File Streams • ADO.NET Data readers • Gains: • Less heap allocations • Method inlining is possible! • Facts • Skynet 146ns for Task, 16ns for ValueTask • Tech Empower (Plaintext) +2.6% 40
  • 39. Pipelines (Channels) • „ high performance zero-copy buffer-pool-managed asynchronous message pipes” – Marc Gravell from Stack Overflow • Pipeline pushes data to you rather than having you pull. • When writing to a pipeline, the caller allocates memory from the pipeline directly. • No new memory is allocated. Only pooled memory buffer is used. 43
  • 40. Simplified Flow Asks for a memory buffer. Writes the data to the buffer. Returns pooled memory. Starts awaiting for the data. Reads the data from buffer. Uses low-allocating Span based apis (parsing etc). Returns the memory to the pool when done. 44
  • 41. System.Runtime.CompilerServices.Unsafe T As<T>(object o) where T : class; void* AsPointer<T>(ref T value); void Copy<T>(void* destination, ref T source); void Copy<T>(ref T destination, void* source); void CopyBlock(void* destination, void* source, uint byteCount); void InitBlock(void* startAddress, byte value, uint byteCount); T Read<T>(void* source); int SizeOf<T>(); void Write<T>(void* destination, T value); 45
  • 42. Supported frameworks 46 Package name .NET Standard .NET Framework Release Nuget feed System.Slices 1.0 4.5 1.2? Clr/fxlab System.Buffers 1.1 4.5.1 1.0 nuget.org System.Threading.Task.Extensions 1.0 4.5 1.0 nuget.org System.Runtime.CompilerServices.Unsafe 1.0 4.5 1.0 corefx
  • 43. Questions? Contact: @SitnikAdam [email protected] You can find the benchmarks at https://github.com/adamsitnik/DotNetCorePerformance https://github.com/adamsitnik/CSharpSevenBenchmarks