函数调用:.NET各种方式调用函数性能对比来源: 发布时间:星期四, 2009年2月12日 浏览:130次 评论:0
using ![]() using ![]() using ![]() using ![]() using ![]() public ![]() { public delegate ![]() ![]() public ![]() { ![]() ![]() } public ![]() { [MethodImpl(MethodImplOptions.NoInlining)] public ![]() ![]() { ![]() } [MethodImpl(MethodImplOptions.NoInlining)] public ![]() ![]() ![]() ![]() { ![]() } } public ![]() ![]() { AssemblyName asmName = ![]() ![]() asmName.Name = "DynamicAssembly"; AssemblyBuilder asmBuilder = AppDo ![]() ![]() ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("DynamicModule"); MethodBuilder funBuilder = modBuilder.DefineGlobalMethod("add", MethodAttributes.Public | MethodAttributes.Static, typeof( ![]() ![]() ![]() ILGenerator il = funBuilder.GetILGenerator ![]() il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Add); il.Emit(OpCodes.Ret); il.Emit(OpCodes.Ret); modBuilder.CreateGlobalFunctions ![]() MethodInfo method = modBuilder.GetMethod("add"); ![]() } public ![]() ![]() { DynamicMethod dm = ![]() ![]() ![]() ![]() ![]() ILGenerator il = dm.GetILGenerator ![]() il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Add); il.Emit(OpCodes.Ret); ![]() } public ![]() ![]() { Type baseType = typeof(IAdd); //创建动态 ![]() ![]() AssemblyName asmName = ![]() AssemblyBuilder assembly = AppDo ![]() ![]() //创建动态模块 ![]() ModuleBuilder module = assembly.DefineDynamicModule("add.module"); //创建类型 MyClass ![]() TypeBuilder type = module.DefineType("MyClass", TypeAttributes.Class, typeof(Object), ![]() ![]() //创建思路方法 MethodAttributes attribute = baseType.GetMethod("add").Attributes & ~(MethodAttributes.Abstract); MethodBuilder method = type.DefineMethod("add", attribute, typeof( ![]() ![]() ![]() ILGenerator il = method.GetILGenerator ![]() il = method.GetILGenerator ![]() il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Add); il.Emit(OpCodes.Ret); // 显式接口思路方法需要定义 Override ![]() ![]() type.DefineMethodOverride(method, baseType.GetMethod("add")); // 创建类型 MyClass ![]() Type myClass = type.CreateType ![]() object o = Activator.CreateInstance(myClass); IAdd iadd = o as IAdd; ![]() } ![]() ![]() ![]() { const ![]() Stopwatch time = ![]() ![]() time.Start ![]() for ( ![]() i ![]() time.Stop ![]() Console.WriteLine("直接执行时间:" + time.ElapsedMilliseconds); time.Start ![]() for ( ![]() i = addClass. ![]() time.Stop ![]() Console.WriteLine("静态 ![]() time.Start ![]() addClass add = ![]() ![]() for ( ![]() i = add.add(i); time.Stop ![]() Console.WriteLine("成员 ![]() AddDelegate ![]() ![]() ![]() time.Start ![]() for ( ![]() i = ![]() time.Stop ![]() Console.WriteLine("静态思路方法 ![]() time.Start ![]() IAdd iadd = ![]() ![]() for ( ![]() i = iadd.add(i); time.Stop ![]() Console.WriteLine("接口 ![]() MethodInfo addMethod = addMethodInfo ![]() time.Start ![]() for ( ![]() i = ( ![]() ![]() time.Stop ![]() Console.WriteLine("反射Invoke执行时间:" + time.ElapsedMilliseconds * 100); DynamicMethod dynamicMethod = addDynamicMethod ![]() time.Start ![]() for ( ![]() i = ( ![]() ![]() time.Stop ![]() Console.WriteLine("DynamicMethod.Invoke执行时间:" + time.ElapsedMilliseconds * 100); AddDelegate dynamicAddDelegate = (AddDelegate)dynamicMethod.CreateDelegate(typeof(AddDelegate)); time.Start ![]() for ( ![]() i = dynamicAddDelegate(i); time.Stop ![]() Console.WriteLine("DynamicMethod生成delegate执行时间:" + time.ElapsedMilliseconds); IAdd dynamicIAdd = addInterface ![]() time.Start ![]() for ( ![]() i = dynamicIAdd.add(i); time.Stop ![]() Console.WriteLine("emit生成 ![]() ![]() Console.ReadLine ![]() } } using ![]() using ![]() using ![]() using ![]() using ![]() public ![]() { public delegate ![]() ![]() public ![]() { ![]() ![]() } public ![]() { [MethodImpl(MethodImplOptions.NoInlining)] public ![]() ![]() { ![]() } [MethodImpl(MethodImplOptions.NoInlining)] public ![]() ![]() ![]() ![]() { ![]() } } public ![]() ![]() { AssemblyName asmName = ![]() ![]() asmName.Name = "DynamicAssembly"; AssemblyBuilder asmBuilder = AppDo ![]() ![]() ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("DynamicModule"); MethodBuilder funBuilder = modBuilder.DefineGlobalMethod("add", MethodAttributes.Public | MethodAttributes.Static, typeof( ![]() ![]() ![]() ILGenerator il = funBuilder.GetILGenerator ![]() il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Add); il.Emit(OpCodes.Ret); il.Emit(OpCodes.Ret); modBuilder.CreateGlobalFunctions ![]() MethodInfo method = modBuilder.GetMethod("add"); ![]() } public ![]() ![]() { DynamicMethod dm = ![]() ![]() ![]() ![]() ![]() ILGenerator il = dm.GetILGenerator ![]() il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Add); il.Emit(OpCodes.Ret); ![]() } public ![]() ![]() { Type baseType = typeof(IAdd); //创建动态 ![]() ![]() AssemblyName asmName = ![]() AssemblyBuilder assembly = AppDo ![]() ![]() //创建动态模块 ![]() ModuleBuilder module = assembly.DefineDynamicModule("add.module"); //创建类型 MyClass ![]() TypeBuilder type = module.DefineType("MyClass", TypeAttributes.Class, typeof(Object), ![]() ![]() //创建思路方法 MethodAttributes attribute = baseType.GetMethod("add").Attributes & ~(MethodAttributes.Abstract); MethodBuilder method = type.DefineMethod("add", attribute, typeof( ![]() ![]() ![]() ILGenerator il = method.GetILGenerator ![]() il = method.GetILGenerator ![]() il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Add); il.Emit(OpCodes.Ret); // 显式接口思路方法需要定义 Override ![]() ![]() type.DefineMethodOverride(method, baseType.GetMethod("add")); // 创建类型 MyClass ![]() Type myClass = type.CreateType ![]() object o = Activator.CreateInstance(myClass); IAdd iadd = o as IAdd; ![]() } ![]() ![]() ![]() { const ![]() Stopwatch time = ![]() ![]() time.Start ![]() for ( ![]() i ![]() time.Stop ![]() Console.WriteLine("直接执行时间:" + time.ElapsedMilliseconds); time.Start ![]() for ( ![]() i = addClass. ![]() time.Stop ![]() Console.WriteLine("静态 ![]() time.Start ![]() addClass add = ![]() ![]() for ( ![]() i = add.add(i); time.Stop ![]() Console.WriteLine("成员 ![]() AddDelegate ![]() ![]() ![]() time.Start ![]() for ( ![]() i = ![]() time.Stop ![]() Console.WriteLine("静态思路方法 ![]() time.Start ![]() IAdd iadd = ![]() ![]() for ( ![]() i = iadd.add(i); time.Stop ![]() Console.WriteLine("接口 ![]() MethodInfo addMethod = addMethodInfo ![]() time.Start ![]() for ( ![]() i = ( ![]() ![]() time.Stop ![]() Console.WriteLine("反射Invoke执行时间:" + time.ElapsedMilliseconds * 100); DynamicMethod dynamicMethod = addDynamicMethod ![]() time.Start ![]() for ( ![]() i = ( ![]() ![]() time.Stop ![]() Console.WriteLine("DynamicMethod.Invoke执行时间:" + time.ElapsedMilliseconds * 100); AddDelegate dynamicAddDelegate = (AddDelegate)dynamicMethod.CreateDelegate(typeof(AddDelegate)); time.Start ![]() for ( ![]() i = dynamicAddDelegate(i); time.Stop ![]() Console.WriteLine("DynamicMethod生成delegate执行时间:" + time.ElapsedMilliseconds); IAdd dynamicIAdd = addInterface ![]() time.Start ![]() for ( ![]() i = dynamicIAdd.add(i); time.Stop ![]() Console.WriteLine("emit生成 ![]() ![]() Console.ReadLine ![]() } } 以下是我电脑 ![]() 直接执行时间:105 静态 ![]() 成员 ![]() 静态思路方法 ![]() 接口 ![]() 反射Invoke执行时间:434000 DynamicMethod.Invoke执行时间:914600 DynamicMethod生成delegate执行时间:9674 emit生成 ![]() ![]() 0
相关文章读者评论发表评论 |