C# 直接调用vs 委托vs动态调用vs动态类型vs反射,最佳性能测试
2014-02-25 02:58
639 查看
懒得解释,自己看代码
测试结果:
Direct call:00:00:00.0742191
Delegate Direct:00:00:00.0687487
Method Factory(IL):00:00:00.2015243
Direct IL:00:00:00.1980190
New Type:00:00:00.0860233
Reflection:00:00:02.4178550
测试结果:
Direct call:00:00:00.0742191
Delegate Direct:00:00:00.0687487
Method Factory(IL):00:00:00.2015243
Direct IL:00:00:00.1980190
New Type:00:00:00.0860233
Reflection:00:00:02.4178550
using System.Reflection; using System.Reflection.Emit; using MoeCard.Emit; using MoeCard.Reflection; namespace MoeCard.TestConsole { public class Program { public static void DoSomeThing() { } private static void Main(string[] args) { const int loops = 10000000; Stopwatch sw = new Stopwatch(); //General delegation Action action1 = new Action(DoSomeThing); //Dynamic method MethodFactory<Action> method = MethodFactory.Create<Action>();//自己写的一个动态方法封装类,不必追究其原理 method.CallMethod(action1).Return(); Action action2 = method.Delegation; //Reflection MethodInfo doSomething = action1.Method; //Standard Dynamic method DynamicMethod method2 = new DynamicMethod("DoSomeThing", null, null); ILGenerator generator = method2.GetILGenerator(); generator.Emit(OpCodes.Call, doSomething); generator.Emit(OpCodes.Ret); Action action3 = method2.CreateDelegate(typeof (Action)) as Action; //Type Builder AssemblyName assemblyName = Assembly.GetExecutingAssembly().GetName();//最后这玩意儿胜出 AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicClassModule"); TypeBuilder newTypeBuilder = moduleBuilder.DefineType("NewType"); MethodBuilder methodBuilder = newTypeBuilder.DefineMethod("DoSomeThing", MethodAttributes.Public | MethodAttributes.Static); generator = methodBuilder.GetILGenerator(); generator.Emit(OpCodes.Call, doSomething); generator.Emit(OpCodes.Ret); Type newType = newTypeBuilder.CreateType(); Action action4 = Delegate.CreateDelegate(typeof (Action), newType.GetMethod("DoSomeThing")) as Action; assemblyBuilder.Save("DynamicAssembly.dll"); sw.Restart(); for (int i = loops; i != 0; i--) { DoSomeThing(); } sw.Stop(); Console.WriteLine("Direct call:" + sw.Elapsed); action1(); sw.Restart(); for (int i = loops; i != 0; i--) { action1(); } sw.Stop(); Console.WriteLine("Delegate Direct:" + sw.Elapsed); action2(); sw.Restart(); for (int i = loops; i != 0; i--) { action2(); } sw.Stop(); Console.WriteLine("Method Factory(IL):" + sw.Elapsed); action3(); sw.Restart(); for (int i = loops; i != 0; i--) { action3(); } sw.Stop(); Console.WriteLine("Direct IL:" + sw.Elapsed); action4(); sw.Restart(); for (int i = loops; i != 0; i--) { action4(); } sw.Stop(); Console.WriteLine("New Type:" + sw.Elapsed); sw.Restart(); for (int i = loops; i != 0; i--) { doSomething.Invoke(null, null); } sw.Stop(); Console.WriteLine("Reflection:" + sw.Elapsed); Console.ReadLine(); } } }
相关文章推荐
- C#成员函数直接调用和反射+委托的性能比较
- 【点滴积累】在C#中使用反射动态调用类型成员
- VS2013 C#调用EXCEL 编译报错:找不到编译动态表达式所需的一个或多个类型。是否缺少引用?
- 直接调用、委托与反射调用的性能区别
- 【点滴积累】在C#中使用反射动态调用类型成员
- 反射(4)反射性能问题:直接调用vs反射调用
- 使用反射、泛型和委托,动态调用对象的属性和方法——性能和灵活性兼备的方法
- C#实现反射调用动态加载的DLL文件中的方法
- 各种反射调用性能测试(赞一个)
- C#实现反射调用动态加载的DLL文件中的方法
- 怎样在不对控件类型进行硬编码的情况下在 C#vs 中动态添加控件
- C#反射动态调用窗体,动态实例化窗体的方法
- C# 调用 C++ DLL 中的委托,引发“对XXX::Invoke类型的已垃圾回收委托进行了回调”错误的解决办法
- C# 利用反射动态创建对象——带参数的构造函数和String类型
- c#关于反射与特性《一》---动态调用成员
- c# “XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
- C#反射动态调用dll中的方法,并返回结果
- C#反射:获取自定义类,动态调用方法
- C#直接赋值和反射赋值(无GC)的性能比较
- C# 通过反射来动态创建泛型类型