// File RTCG7.cs --- measure time to generate (much) code // sestoft@itu.dk * 2002-09 using System; using System.Reflection; using System.Reflection.Emit; class RTCG7 { public static void Main(String [] args) { int count = int.Parse(args[0]); int calls = int.Parse(args[1]); AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = "myassembly"; // Build: run-only assembly AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); // Build: module mymodule ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("mymodule"); // Build: public class MyClass { ... } TypeBuilder typeBuilder = moduleBuilder.DefineType("MyClass", TypeAttributes.Class | TypeAttributes.Public, typeof(Object)); Timer t1 = new Timer(); { // Build: public static void MyMethod1(int x) { ... } MethodBuilder methodBuilder = typeBuilder.DefineMethod("MyMethod1", MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(int) }); // Obtain an IL generator to build the method body ILGenerator ilg = methodBuilder.GetILGenerator(); ilg.Emit(OpCodes.Ldarg_0); ilg.Emit(OpCodes.Ldc_I4_1); ilg.Emit(OpCodes.Add); for (int i=count; i>0; i--) { ilg.Emit(OpCodes.Ldarg_0); ilg.Emit(OpCodes.Add); } ilg.Emit(OpCodes.Pop); ilg.Emit(OpCodes.Ret); } Type ty = typeBuilder.CreateType(); for (int i=calls; i>0; i--) { ty.GetMethod("MyMethod1").Invoke(null, new object[] { count }); } Console.WriteLine("Generation and " + calls + " calls: " + t1.Check() + " sec"); } } // Crude timing utility ---------------------------------------- public class Timer { private DateTime start; public Timer() { start = DateTime.Now; } public double Check() { TimeSpan dur = DateTime.Now - start; return dur.TotalSeconds; } }