Keresés

Új hozzászólás Aktív témák

  • sztanozs

    veterán

    válasz pmonitor #19843 üzenetére

    A problema nem az object/struct miatt van, hanem az unboxing miatt, mivel az egyik objektumod object tipusu, ezert az erteket explicite be-, es kicsomagolod (20., 89. es 93. sor). Ez viszi el a plusz idot, nem a GC:
    .method private hidebysig static
    void Main (
    string[] args
    ) cil managed
    {
    .custom instance void System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = (
    01 00 01 00 00
    )
    // Method begins at RVA 0x2094
    // Header size: 12
    // Code size: 171 (0xab)
    .maxstack 6
    .entrypoint
    .locals init (
    [0] int64 i,
    [1] int64 j,
    [2] int64 m,
    [3] class [System.Runtime]System.Diagnostics.Stopwatch sw,
    [4] int64 n,
    [5] object k,
    [6] int64 p,
    [7] bool,
    [8] bool
    )

    // {
    IL_0000: nop
    // long num = 0L;
    IL_0001: ldc.i4.0
    IL_0002: conv.i8
    IL_0003: stloc.0
    // long num2 = 0L;
    IL_0004: ldc.i4.0
    IL_0005: conv.i8
    IL_0006: stloc.1
    // long num3 = 0L;
    IL_0007: ldc.i4.0
    IL_0008: conv.i8
    IL_0009: stloc.2
    // Stopwatch stopwatch = Stopwatch.StartNew();
    IL_000a: call class [System.Runtime]System.Diagnostics.Stopwatch [System.Runtime]System.Diagnostics.Stopwatch::StartNew()
    IL_000f: stloc.3
    // for (num3 = 0L; num3 < 3000000000u; num3++)
    IL_0010: ldc.i4.0
    IL_0011: conv.i8
    IL_0012: stloc.2
    // (no C# code)
    IL_0013: br.s IL_0020
    // loop start (head: IL_0020)
    // num = num3;
    IL_0015: nop
    IL_0016: ldloc.2
    IL_0017: stloc.0
    // num2 = num;
    IL_0018: ldloc.0
    IL_0019: stloc.1
    // for (num3 = 0L; num3 < 3000000000u; num3++)
    IL_001a: nop
    IL_001b: ldloc.2
    IL_001c: ldc.i4.1
    IL_001d: conv.i8
    IL_001e: add
    IL_001f: stloc.2

    // for (num3 = 0L; num3 < 3000000000u; num3++)
    IL_0020: ldloc.2
    IL_0021: ldc.i4 -1294967296
    IL_0026: conv.u8
    IL_0027: clt
    IL_0029: stloc.s 7
    // long elapsedMilliseconds = stopwatch.ElapsedMilliseconds;
    IL_002b: ldloc.s 7
    IL_002d: brtrue.s IL_0015
    // end loop

    IL_002f: ldloc.3
    IL_0030: callvirt instance int64 [System.Runtime]System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()
    IL_0035: stloc.s 4
    // for (num3 = 0L; num3 < 3000000000u; num3++)
    IL_0037: ldc.i4.0
    IL_0038: conv.i8
    IL_0039: stloc.2
    // (no C# code)
    IL_003a: br.s IL_0053
    // loop start (head: IL_0053)
    // object obj = num3;
    IL_003c: nop
    IL_003d: ldloc.2
    IL_003e: box [System.Runtime]System.Int64
    IL_0043: stloc.s 5
    // num2 = (long)obj;
    IL_0045: ldloc.s 5
    IL_0047: unbox.any [System.Runtime]System.Int64
    IL_004c: stloc.1
    // for (num3 = 0L; num3 < 3000000000u; num3++)
    IL_004d: nop
    IL_004e: ldloc.2
    IL_004f: ldc.i4.1
    IL_0050: conv.i8
    IL_0051: add
    IL_0052: stloc.2

    // for (num3 = 0L; num3 < 3000000000u; num3++)
    IL_0053: ldloc.2
    IL_0054: ldc.i4 -1294967296
    IL_0059: conv.u8
    IL_005a: clt
    IL_005c: stloc.s 8
    // long elapsedMilliseconds2 = stopwatch.ElapsedMilliseconds;
    IL_005e: ldloc.s 8
    IL_0060: brtrue.s IL_003c
    // end loop

    IL_0062: ldloc.3
    IL_0063: callvirt instance int64 [System.Runtime]System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()
    IL_0068: stloc.s 6
    // Console.WriteLine("{0} {1} {2} {3}", num2, num3, elapsedMilliseconds, elapsedMilliseconds2 - elapsedMilliseconds);
    IL_006a: ldstr "{0} {1} {2} {3}"
    IL_006f: ldc.i4.4
    IL_0070: newarr [System.Runtime]System.Object
    IL_0075: dup
    IL_0076: ldc.i4.0
    IL_0077: ldloc.1
    IL_0078: box [System.Runtime]System.Int64
    IL_007d: stelem.ref
    IL_007e: dup
    IL_007f: ldc.i4.1
    IL_0080: ldloc.2
    IL_0081: box [System.Runtime]System.Int64
    IL_0086: stelem.ref
    IL_0087: dup
    IL_0088: ldc.i4.2
    IL_0089: ldloc.s 4
    IL_008b: box [System.Runtime]System.Int64
    IL_0090: stelem.ref
    IL_0091: dup
    IL_0092: ldc.i4.3
    IL_0093: ldloc.s 6
    IL_0095: ldloc.s 4
    IL_0097: sub
    IL_0098: box [System.Runtime]System.Int64
    IL_009d: stelem.ref
    // (no C# code)
    IL_009e: call void [System.Console]System.Console::WriteLine(string, object[])
    // Console.ReadKey();
    IL_00a3: nop
    IL_00a4: call valuetype [System.Console]System.ConsoleKeyInfo [System.Console]System.Console::ReadKey()
    IL_00a9: pop
    // }
    IL_00aa: ret
    } // end of method Program::Main

    Az optimalizalt valtozatot nezve jol lahthato a ket "felesleges" utasitas:
    // loop start (head: IL_0018)
    IL_0011: ldloc.1
    IL_0012: stloc.0

    vs
    // loop start (head: IL_003e)
    IL_002d: ldloc.1
    IL_002e: box [System.Runtime]System.Int64
    IL_0033: unbox.any [System.Runtime]System.Int64
    IL_0038: stloc.0

    [ Szerkesztve ]

    JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

Új hozzászólás Aktív témák