Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The following code is for the post "Activator.CreateInstance and beyond"
**All source code is provided as is, with no warranties intended or implied. Use at your own risk.**
Instruction
perl sample.pl > sample.cs
csc /t:library sample.cs
csc /o+ latenew.cs
To run: latenew sample.dll 1000 1000
sample.pl
for $i (1..2000)
{
$name = "C$i";
print "public class $name { public $name() {} public $name(int i) {} public $name(string s) {} }\n";
}
latenew.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
class LateNew
{
static int LOOP;
static int TYPENUM;
static Type[] types;
delegate void Approach(out DateTime prepareStart, out DateTime executeStart, out DateTime finish);
static void Measure(Approach d)
{
DateTime prepareStart, executeStart, finish;
d(out prepareStart, out executeStart, out finish);
Console.WriteLine("{0} - {1}", executeStart - prepareStart, finish - executeStart);
GC.Collect(2);
GC.WaitForPendingFinalizers();
}
static void Main(string[] args)
{
types = Assembly.LoadFrom(args[0]).GetTypes();
LOOP = Int32.Parse(args[1]);
TYPENUM = Int32.Parse(args[2]);
if (TYPENUM > types.Length) TYPENUM = types.Length;
Console.WriteLine("Total Type #: {0}", types.Length);
Console.WriteLine("Used Type #: {0}", TYPENUM);
Console.WriteLine("Loop: {0}", LOOP);
Measure(ParameterAndActivator);
Measure(ParameterAndEmit);
Measure(ParameterAndEmitAndDelegate);
Measure(ParameterAndDynamicMethod);
Measure(ParameterAndDynamicMethodAndDelegate);
Measure(ParameterAndCtorInfo);
Measure(ParameterlessAndActivator);
Measure(ParameterlessAndEmit);
Measure(ParameterlessAndEmitAndDelegate);
Measure(ParameterlessAndDynamicMethod);
Measure(ParameterlessAndDynamicMethodAndDelegate);
Measure(ParameterlessAndCtorInfo);
}
public delegate object CtorInt32Delegate(int arg);
public delegate object CtorDelegate();
private static void ParameterAndActivator(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
executeStart = prepareStart;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
Activator.CreateInstance(types[j++], 100);
finish = DateTime.Now;
}
private static void ParameterAndCtorInfo(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
Dictionary<Type, ConstructorInfo> ctors = new Dictionary<Type, ConstructorInfo>();
foreach (Type t in types)
ctors.Add(t, t.GetConstructor(new Type[] { typeof(int) }));
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]].Invoke(new object[] { 100 });
finish = DateTime.Now;
}
private static void ParameterAndDynamicMethod(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
Dictionary<Type, DynamicMethod> ctors = new Dictionary<Type, DynamicMethod>();
foreach (Type type in types)
{
DynamicMethod dm = new DynamicMethod("MyCtor", type, new Type[] { typeof(int) }, typeof(LateNew).Module, true);
ILGenerator ilgen = dm.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(new Type[] { typeof(int) }));
ilgen.Emit(OpCodes.Ret);
ctors.Add(type, dm);
}
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]].Invoke(null, new object[] { 100 });
finish = DateTime.Now;
}
private static void ParameterAndDynamicMethodAndDelegate(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
Dictionary<Type, CtorInt32Delegate> ctors = new Dictionary<Type, CtorInt32Delegate>();
foreach (Type type in types)
{
DynamicMethod dm = new DynamicMethod("MyCtor", type, new Type[] { typeof(int) }, typeof(LateNew).Module, true);
ILGenerator ilgen = dm.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(new Type[] { typeof(int) }));
ilgen.Emit(OpCodes.Ret);
ctors.Add(type, (CtorInt32Delegate)dm.CreateDelegate(typeof(CtorInt32Delegate)));
}
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]](100);
finish = DateTime.Now;
}
private static void ParameterAndEmit(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
AssemblyBuilder asmBldr = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("inmemory"), AssemblyBuilderAccess.Run);
ModuleBuilder modBldr = asmBldr.DefineDynamicModule("helper");
TypeBuilder typeBldr = modBldr.DefineType("ClassFactory");
foreach (Type type in types)
{
MethodBuilder methBldr = typeBldr.DefineMethod(type.Name, MethodAttributes.Public | MethodAttributes.Static, type, new Type[] { typeof(int) });
ILGenerator ilgen = methBldr.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(new Type[] { typeof(int) }));
ilgen.Emit(OpCodes.Ret);
}
Type baked = typeBldr.CreateType();
Dictionary<Type, MethodInfo> ctors = new Dictionary<Type, MethodInfo>();
foreach (Type type in types)
ctors.Add(type, baked.GetMethod(type.Name));
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]].Invoke(null, new object[] { 100 });
finish = DateTime.Now;
}
private static void ParameterAndEmitAndDelegate(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
AssemblyBuilder asmBldr = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("inmemory"), AssemblyBuilderAccess.Run);
ModuleBuilder modBldr = asmBldr.DefineDynamicModule("helper");
TypeBuilder typeBldr = modBldr.DefineType("ClassFactory");
foreach (Type type in types)
{
MethodBuilder methBldr = typeBldr.DefineMethod(type.Name, MethodAttributes.Public | MethodAttributes.Static, type, new Type[] { typeof(int) });
ILGenerator ilgen = methBldr.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(new Type[] { typeof(int) }));
ilgen.Emit(OpCodes.Ret);
}
Type baked = typeBldr.CreateType();
Dictionary<Type, CtorInt32Delegate> ctors = new Dictionary<Type, CtorInt32Delegate>();
foreach (Type type in types)
ctors.Add(type, (CtorInt32Delegate)Delegate.CreateDelegate(typeof(CtorInt32Delegate), baked.GetMethod(type.Name)));
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]](100);
finish = DateTime.Now;
}
private static void ParameterlessAndActivator(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
executeStart = prepareStart;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
Activator.CreateInstance(types[j++]);
finish = DateTime.Now;
}
private static void ParameterlessAndCtorInfo(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
Dictionary<Type, ConstructorInfo> ctors = new Dictionary<Type, ConstructorInfo>();
foreach (Type t in types)
ctors.Add(t, t.GetConstructor(Type.EmptyTypes));
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]].Invoke(null);
finish = DateTime.Now;
}
private static void ParameterlessAndDynamicMethod(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
Dictionary<Type, DynamicMethod> ctors = new Dictionary<Type, DynamicMethod>();
foreach (Type type in types)
{
DynamicMethod dm = new DynamicMethod("MyCtor", type, Type.EmptyTypes, typeof(LateNew).Module, true);
ILGenerator ilgen = dm.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
ilgen.Emit(OpCodes.Ret);
ctors.Add(type, dm);
}
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]].Invoke(null, null);
finish = DateTime.Now;
}
private static void ParameterlessAndDynamicMethodAndDelegate(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
Dictionary<Type, CtorDelegate> ctors = new Dictionary<Type, CtorDelegate>();
foreach (Type type in types)
{
DynamicMethod dm = new DynamicMethod("MyCtor", type, Type.EmptyTypes, typeof(LateNew).Module, true);
ILGenerator ilgen = dm.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
ilgen.Emit(OpCodes.Ret);
ctors.Add(type, (CtorDelegate)dm.CreateDelegate(typeof(CtorDelegate)));
}
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]]();
finish = DateTime.Now;
}
private static void ParameterlessAndEmit(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
AssemblyBuilder asmBldr = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("inmemory"), AssemblyBuilderAccess.Run);
ModuleBuilder modBldr = asmBldr.DefineDynamicModule("helper");
TypeBuilder typeBldr = modBldr.DefineType("ClassFactory");
foreach (Type type in types)
{
MethodBuilder methBldr = typeBldr.DefineMethod(type.Name, MethodAttributes.Public | MethodAttributes.Static, type, Type.EmptyTypes);
ILGenerator ilgen = methBldr.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
ilgen.Emit(OpCodes.Ret);
}
Type baked = typeBldr.CreateType();
Dictionary<Type, MethodInfo> ctors = new Dictionary<Type, MethodInfo>();
foreach (Type type in types)
ctors.Add(type, baked.GetMethod(type.Name));
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]].Invoke(null, null);
finish = DateTime.Now;
}
private static void ParameterlessAndEmitAndDelegate(out DateTime prepareStart, out DateTime executeStart, out DateTime finish)
{
prepareStart = DateTime.Now;
AssemblyBuilder asmBldr = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("inmemory"), AssemblyBuilderAccess.Run);
ModuleBuilder modBldr = asmBldr.DefineDynamicModule("helper");
TypeBuilder typeBldr = modBldr.DefineType("ClassFactory");
foreach (Type type in types)
{
MethodBuilder methBldr = typeBldr.DefineMethod(type.Name, MethodAttributes.Public | MethodAttributes.Static, type, Type.EmptyTypes);
ILGenerator ilgen = methBldr.GetILGenerator();
ilgen.Emit(OpCodes.Nop);
ilgen.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
ilgen.Emit(OpCodes.Ret);
}
Type baked = typeBldr.CreateType();
Dictionary<Type, CtorDelegate> ctors = new Dictionary<Type, CtorDelegate>();
foreach (Type type in types)
ctors.Add(type, (CtorDelegate)Delegate.CreateDelegate(typeof(CtorDelegate), baked.GetMethod(type.Name)));
executeStart = DateTime.Now;
for (int i = 0; i < LOOP; i++)
for (int j = 0; j < TYPENUM; )
ctors[types[j++]]();
finish = DateTime.Now;
}
}