jhlee8804
9/29/2013 - 1:51 PM

Test inlining method

/*
 * Following code for test an method will be inlined by JIT or not
 * Tested on Framework 4.5, Win8 x64
 * 
 * http://blogs.msdn.com/b/ericgu/archive/2004/01/29/64717.aspx
 * http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/20/aggressive-inlining-in-the-clr-4-5-jit.aspx
 */

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Fa(1)); // Main
        Console.WriteLine(Fb(1)); // Fb
        Console.WriteLine(Fc(1)); // Main
        Console.WriteLine(Fd(1)); // Main
        Console.WriteLine(Fe(1)); // Fe if Platform target is x86, Main if x64
        Console.WriteLine(Ff(1)); // Ff
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    static string Fa(int a)
    {
        var s = a.ToString();
        var b = uint.Parse(s);
        var c = (a + b) / 2;
        var ss = c.ToString();
        var d = int.Parse(ss);
        return new StackFrame().GetMethod().Name;
    }

    static string Fb(int a)
    {
        var s = a.ToString();
        var b = uint.Parse(s);
        var c = (a + b) / 2;
        var ss = c.ToString();
        var d = int.Parse(ss);
        return new StackFrame().GetMethod().Name;
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    static string Fc(int a)
    {
        return new StackFrame().GetMethod().Name;
    }

    static string Fd(int a)
    {
        return new StackFrame().GetMethod().Name;
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    static string Fe(int a)
    {
        a += 1;
        return new StackFrame().GetMethod().Name;
    }

    static string Ff(int a)
    {
        a += 1;
        return new StackFrame().GetMethod().Name;
    }
}