Low Latency in managed code

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