Upload
romainverdier
View
222
Download
0
Embed Size (px)
Citation preview
7/25/2019 Low Latency in managed code
1/90
7/25/2019 Low Latency in managed code
2/90
7/25/2019 Low Latency in managed code
3/90
7/25/2019 Low Latency in managed code
4/90
7/25/2019 Low Latency in managed code
5/90
7/25/2019 Low Latency in managed code
6/90
7/25/2019 Low Latency in managed code
7/90
7/25/2019 Low Latency in managed code
8/90
7/25/2019 Low Latency in managed code
9/90
7/25/2019 Low Latency in managed code
10/90
7/25/2019 Low Latency in managed code
11/90
7/25/2019 Low Latency in managed code
12/90
7/25/2019 Low Latency in managed code
13/90
7/25/2019 Low Latency in managed code
14/90
7/25/2019 Low Latency in managed code
15/90
7/25/2019 Low Latency in managed code
16/90
7/25/2019 Low Latency in managed code
17/90
7/25/2019 Low Latency in managed code
18/90
7/25/2019 Low Latency in managed code
19/90
Latency
Throughput
7/25/2019 Low Latency in managed code
20/90
/
7/25/2019 Low Latency in managed code
21/90
7/25/2019 Low Latency in managed code
22/90
7/25/2019 Low Latency in managed code
23/90
7/25/2019 Low Latency in managed code
24/90
7/25/2019 Low Latency in managed code
25/90
7/25/2019 Low Latency in managed code
26/90
7/25/2019 Low Latency in managed code
27/90
7/25/2019 Low Latency in managed code
28/90
7/25/2019 Low Latency in managed code
29/90
Latency Mystery series
7/25/2019 Low Latency in managed code
30/90
7/25/2019 Low Latency in managed code
31/90
7/25/2019 Low Latency in managed code
32/90
7/25/2019 Low Latency in managed code
33/90
7/25/2019 Low Latency in managed code
34/90
7/25/2019 Low Latency in managed code
35/90
0
50 000 000
100 000 000
150 000 000
200 000 000
250 000 000
300 000 000
350 000 000
400 000 000
450 000 000
500 000 000
1 thread no lock 1 thread with loc
ops/s per thread
2ns
7/25/2019 Low Latency in managed code
36/90
0
50 000
100 000
150 000
200 000
250 000
1 thread
no lock
1 thread
with lock
2 threads 3 threads 4 threads 5 th
ops/s per thread global ops/s
5s
5
7/25/2019 Low Latency in managed code
37/90
0
2 000 000
4 000 000
6 000 000
8 000 000
10 000 000
12 000 000
1 thread 2 threads 3 threads 4 threads 5 thr
99 99,5 99,99 99,999 max
5s
7/25/2019 Low Latency in managed code
38/90
7/25/2019 Low Latency in managed code
39/90
7/25/2019 Low Latency in managed code
40/90
7/25/2019 Low Latency in managed code
41/90
7/25/2019 Low Latency in managed code
42/90
CacheCache
CORE 0 Thread A
CPU
Memory
CORE 1 Thread B
7/25/2019 Low Latency in managed code
43/90
CacheCache
CORE 0 Thread A
CPU
Memory
CORE 1
7/25/2019 Low Latency in managed code
44/90
CacheCache
CORE 0
CPU
Memory
CORE 1 Thread B
7/25/2019 Low Latency in managed code
45/90
CacheCache
CORE 0 Thread A
CPU
Memory
CORE 1 Thread B
7/25/2019 Low Latency in managed code
46/90
CacheCache
CORE 0 Thread A
CPU
Memory
CORE 1 Thread B
7/25/2019 Low Latency in managed code
47/90
CacheCache
CORE 0 Thread A
CPU
Memory
CORE 1 Thread B
7/25/2019 Low Latency in managed code
48/90
7/25/2019 Low Latency in managed code
49/90
7/25/2019 Low Latency in managed code
50/90
7/25/2019 Low Latency in managed code
51/90
7/25/2019 Low Latency in managed code
52/90
7/25/2019 Low Latency in managed code
53/90
7/25/2019 Low Latency in managed code
54/90
7/25/2019 Low Latency in managed code
55/90
7/25/2019 Low Latency in managed code
56/90
7/25/2019 Low Latency in managed code
57/90
7/25/2019 Low Latency in managed code
58/90
7/25/2019 Low Latency in managed code
59/90
List list = newList();f h ( i i li )
7/25/2019 Low Latency in managed code
60/90
foreach(vari inlist){
// Do something}
IList list = newList();foreach(vari inlist){
// Do something}
public Enumerator GetEnumerator()
{
7/25/2019 Low Latency in managed code
61/90
{
// Enumerator is a struct
return new Enumerator(this);
}IEnumerator IEnumerable.GetEnumer
{
return new Enumerator(this); // box
}
IEnumerator IEnumerable.GetEnumerator()
{
return new Enumerator(this); // box
}
7/25/2019 Low Latency in managed code
62/90
structCucumber: IDisposable{
voidDispose(){}
}
7/25/2019 Low Latency in managed code
63/90
vars = newCucumber();s.Dispose();
IL_0000: ldloca.s sIL_0002: initobj CucumberIL_0008: ldloca.s s
IL_000a:callinst n e void Cucumber::Dispose()
7/25/2019 Low Latency in managed code
64/90
IDisposables = newCucumber();s.Dispose();
IL_0000: ldloca.s CS$0$0000IL_0002: initobj CucumberIL_0008: ldloc.1IL_0009: boxCucumberIL_000e: stloc.0IL_000f: ldloc.0IL_0010: callvirtinstance void IDisposable::Dispose
using(vars = newCucumber())
7/25/2019 Low Latency in managed code
65/90
g( ()){}
IL_0000: ldloca.s sIL_0002: initobj Cucumber.try {
IL_0008: leave.s IL_0018} finally {
IL_000a: ldloca.s sIL_000c: constrained.CucumberIL_0012: callvirtinstance void IDisposable::DispIL_0017: endfinally
}
7/25/2019 Low Latency in managed code
66/90
*
7/25/2019 Low Latency in managed code
67/90
[StructLayout(LayoutKind.Sequential)]private structDecimalProxy{
public readonly intflags;public readonly inthi;public readonly intlo;public readonly intmid;
}
7/25/2019 Low Latency in managed code
68/90
vard = 42m;vardecimalProxy =*((DecimalProxy*)(&d));
varflags = decimalProxy.flags;varlo = decimalProxy.lo;varmid = decimalProxy.mid;
varhi = decimalProxy.hi;
// Enjoy your flags-lo-mid-high!
7/25/2019 Low Latency in managed code
69/90
7/25/2019 Low Latency in managed code
70/90
7/25/2019 Low Latency in managed code
71/90
7/25/2019 Low Latency in managed code
72/90
7/25/2019 Low Latency in managed code
73/90
// i l bd
7/25/2019 Low Latency in managed code
74/90
// using lambdaDoSomething(() => Console.WriteLine());
// delegate from method groupDoSomething(Console.WriteLine);
// capturing local variableDoSomething(() => local++);
// capturing fieldDoSomething(() => _field++);
7/25/2019 Low Latency in managed code
75/90
public class NCrafts
{private int_field;
private void DoSomething(Actionaction){}
public voidTest(){
DoSomething(() => _field++);}
}
7/25/2019 Low Latency in managed code
76/90
public class NCrafts{
private int_field;
private void DoSomething(Actionaction){}
public voidTest(){
DoSomething(new Action(AnonymousMethod));}
[CompilerGenerated]public voidAnonymousMethod()
{_field++;
}}
7/25/2019 Low Latency in managed code
77/90
public class NCrafts
{private staticint_field;
private void DoSomething(Actionaction){}
public voidTest(){
DoSomething(() => _field++);}
}
public class NCrafts{
[
CompilerGenerated
]
7/25/2019 Low Latency in managed code
78/90
[CompilerGenerated]privatestaticAction _cachedDelegate;
private static int_field;
private static void DoSomething(Actionaction){}
public voidTest(){
if (_cachedDelegate== null)_cachedDelegate= newAction(Anonymous);
DoSomething(_cachedDelegate);}
[CompilerGenerated]privatestaticvoidAnonymous(){
_field++;}
}
7/25/2019 Low Latency in managed code
79/90
7/25/2019 Low Latency in managed code
80/90
7/25/2019 Low Latency in managed code
81/90
7/25/2019 Low Latency in managed code
82/90
7/25/2019 Low Latency in managed code
83/90
7/25/2019 Low Latency in managed code
84/90
}
7/25/2019 Low Latency in managed code
85/90
}
finally{
// low laten
7/25/2019 Low Latency in managed code
86/90
// low-laten
// can be a// business// requireme
// its hard
7/25/2019 Low Latency in managed code
87/90
// it shard
// matter wh// stack you// rely on
// low laten
7/25/2019 Low Latency in managed code
88/90
// low-laten
// in manage// code is a// real opti
// i th
7/25/2019 Low Latency in managed code
89/90
// is there
// trend hertalk.Close()
}
7/25/2019 Low Latency in managed code
90/90