Skip to content

Instantly share code, notes, and snippets.

@jmangelo
Forked from davidfowl/gist:3172990
Created July 24, 2012 22:30
Show Gist options
  • Select an option

  • Save jmangelo/3173109 to your computer and use it in GitHub Desktop.

Select an option

Save jmangelo/3173109 to your computer and use it in GitHub Desktop.

Revisions

  1. jmangelo revised this gist Jul 24, 2012. 1 changed file with 17 additions and 1 deletion.
    18 changes: 17 additions & 1 deletion gistfile1.cs
    Original file line number Diff line number Diff line change
    @@ -22,6 +22,11 @@ static void Main(string[] args)
    Console.WriteLine("Cached Delegate");
    var cache = Compile(mi);
    Time(() => cache.Invoke(new A(), 1, 2));
    Console.WriteLine();

    Console.WriteLine("Open Delegate");
    var od = CreateOpenDelegate(mi);
    Time(() => od.Invoke(new A(), 1, 2));
    }

    private static void Time(Action a)
    @@ -48,6 +53,17 @@ private static Action<A, int, int> Compile(MethodInfo mi)
    // compile
    return Expression.Lambda<Action<A, int, int>>(body, p1, p2, p3).Compile();
    }

    private static Action<A, int, int> CreateOpenDelegate(MethodInfo mi)
    {
    var openDelegate = Delegate.CreateDelegate(
    typeof(Action<A, int, int>),
    null,
    mi,
    true);

    return (Action<A, int, int>)openDelegate;
    }
    }

    public class A
    @@ -56,4 +72,4 @@ public void Foo(int a, int b)
    {
    }
    }
    }
    }
  2. @davidfowl davidfowl created this gist Jul 24, 2012.
    59 changes: 59 additions & 0 deletions gistfile1.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    using System;
    using System.Diagnostics;
    using System.Linq.Expressions;
    using System.Reflection;

    namespace ConsoleApplication3
    {
    class Program
    {
    static void Main(string[] args)
    {
    var mi = typeof(A).GetMethod("Foo");

    Console.WriteLine("Regular method");
    Time(() => new A().Foo(1, 2));
    Console.WriteLine();

    Console.WriteLine("Invoke");
    Time(() => mi.Invoke(new A(), new object[] { 1, 2 }));
    Console.WriteLine();

    Console.WriteLine("Cached Delegate");
    var cache = Compile(mi);
    Time(() => cache.Invoke(new A(), 1, 2));
    }

    private static void Time(Action a)
    {
    var sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000000; i++)
    {
    a();
    }
    sw.Stop();
    Console.WriteLine(sw.Elapsed);
    }

    private static Action<A, int, int> Compile(MethodInfo mi)
    {
    // Params
    var p1 = Expression.Parameter(typeof(A));
    var p2 = Expression.Parameter(typeof(int));
    var p3 = Expression.Parameter(typeof(int));

    // Body
    var body = Expression.Call(p1, mi, p2, p3);

    // compile
    return Expression.Lambda<Action<A, int, int>>(body, p1, p2, p3).Compile();
    }
    }

    public class A
    {
    public void Foo(int a, int b)
    {
    }
    }
    }