Open
Description
static void Main()
{
for (int i = 0; i < 100; i++)
{
Test();
var _ = Test2;
Thread.Sleep(16);
}
}
[MethodImpl(MethodImplOptions.NoInlining)]
static int Test1()
{
int sum = 0;
for (int i = 0; i < 10; i++)
sum += i;
return sum;
}
static int Test2 { get; set; }
Actual result:
147: JIT compiled Prog:Test1():int [Instrumented Tier0, IL size=21, code size=109, hash=0x792ae54b]
311: JIT compiled Prog:Test1():int [Instrumented Tier0, IL size=21, code size=109, hash=0x792ae54b]
313: JIT compiled Prog:Test1():int [Tier1 with Dynamic PGO, IL size=21, code size=14, hash=0x792ae54b]
152: JIT compiled Prog:get_Test2():int [Tier0, IL size=6, code size=12, hash=0xf8310770]
316: JIT compiled Prog:get_Test2():int [Instrumented Tier0, IL size=6, code size=12, hash=0xf8310770]
319: JIT compiled Prog:get_Test2():int [Tier1, IL size=6, code size=7, hash=0xf8310770]
Since Test1
has a loop we always instrument it in Tier0, but then it's promoted to Instrumented Tier0 again - it can be omitted.
Also, all Tier0 methods should warn VM in advance that they don't need instrumentation at all (e.g. simple auto properties like get_Test2
).
cc @AndyAyersMS