Guest User

Untitled

a guest
Jan 4th, 2018
147
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq.Expressions;
  4.  
  5.  
  6. namespace ConsoleApp11
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             var c1 = BuildLambda<Class1, int>("Id").Compile();
  13.  
  14.             for (int i = 0; i < 100_000_000; i += 100_000)
  15.             {
  16.                 Stopwatch sw = Stopwatch.StartNew();
  17.                 Test1(i);
  18.                 var time1 = sw.ElapsedMilliseconds;
  19.                 sw = Stopwatch.StartNew();
  20.                 Test2(i, c1);
  21.                 var time2 = sw.ElapsedMilliseconds;
  22.  
  23.                 var start = $"{i:N0}".PadRight(10);
  24.                 Console.WriteLine($"{start} iterations - new: {time1}ms. | func {time2}ms.");
  25.  
  26.                 i *= 5;
  27.             }
  28.         }
  29.  
  30.         static void Test1(int count)
  31.         {
  32.             for (int i = 0; i < count; i++)
  33.             {
  34.                 var t = new Class1() { Id = i };
  35.             }
  36.         }
  37.  
  38.         static void Test2(int count, Func<int, Class1> c1)
  39.         {
  40.             for (int i = 0; i < count; i++)
  41.             {
  42.                 var t = c1.Invoke(i);
  43.             }
  44.         }
  45.  
  46.         public static Expression<Func<A1, T>> BuildLambda<T, A1>(string param1Name)
  47.         {
  48.             var createdType = typeof(T);
  49.             var param = Expression.Parameter(typeof(A1), param1Name);
  50.             var ctor = Expression.New(createdType);
  51.             var prop = createdType.GetProperty(param1Name);
  52.             var displayValueAssignment = Expression.Bind(prop, param);
  53.             var memberInit = Expression.MemberInit(ctor, displayValueAssignment);
  54.  
  55.             return
  56.                 Expression.Lambda<Func<A1, T>>(memberInit, param);
  57.         }
  58.     }
  59.  
  60.     public class Class1
  61.     {
  62.         public int Id { get; set; }
  63.  
  64.         public override string ToString()
  65.         {
  66.             return $"My Id is {Id}";
  67.         }
  68.     }
  69.  
  70.     public class ExpressionParam
  71.     {
  72.         public ExpressionParam(string name, Type type)
  73.         {
  74.             this.Name = name;
  75.             this.Type = type;
  76.         }
  77.         public string Name { get; set; }
  78.  
  79.         public Type Type { get; set; }
  80.     }
  81.  
  82. }
RAW Paste Data