C# 直接调用vs 委托vs动态调用vs动态类型vs反射,最佳性能测试
懒得解释,自己看代码
测试结果:
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# 直接调用vs 委托vs动态调用vs动态类型vs反射,最佳性能测试的更多相关文章
- 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法) 创建Delegate (1).Delegate.CreateDelegate(Type, ...
- C#动态调用C++编写的DLL函数
C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- 【C#】 使用Gsof.Native 动态调用 C动态库
[C#] 使用Gsof.Native 动态调用 C动态库 一.背景 使用C# 开发客户端时候,我们经常会调用一些标准的动态库或是C的类库.虽然C# 提供的PInvoke的方式,但因为使用的场景的多变, ...
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...
- C#中动态调用DLL动态链接库
其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress ...
- C#中动态调用DLL动态链接库(转)
本来是想实现控制台程序运行时自动全屏,但是只找到VC下的实现方法(http://www.vckbase.com/bbs/prime/viewprime.asp?id=347). 其中要使用两个未公开的 ...
- 托管非托管Dll动态调用
原文:托管非托管Dll动态调用 最近经常看到有人问托管非托管Dll调用的问题.对于动态库的调用其实很简单.网上很多代码都实现了Dll的静态调用方法.我主要谈论下动态库的动态加载. 对于托管动态库,实现 ...
- C#使用表达式树动态调用方法并实现99乘法表
我们在使用C#编程的时候,经常使用反射来动态调用方法,但有时候需要动态的生成方法,下面介绍使用表达式树的方式来自动生成方法,并调用. 首先需要说明什么是表达式,熟悉Linq的程序猿都用过类似于下面的代 ...
随机推荐
- java 线性规划 和lingo 比较
model:max=13*A+ 23*B; 5*A + 15*B <480 ; 4*A + 4 *B <160 ; 35* A + 20 *B <1190 ; end Variabl ...
- 基于Web2.0的RIA框架设计与实现
http://www.doc88.com/p-8866851533856.html http://cdmd.cnki.com.cn/Article/CDMD-10614-1012472890.htm
- Ubuntu如何更新源
Ubuntu的源其实就是更新各种软件包需要用到镜像网站, 当大家在虚拟机上安装Linux镜像的时候肯定会遇到各种Linux软件没有安装,当你用apt-get安装的时候它会提示无效的网址,这个时候你就需 ...
- C3属性的轮播图(持续更新)
天气好冷,都不想写代码.就先写个没有焦点的轮播图,过两天在补全. 用的是CSS3的属性 过渡transition 和 转换 transfrom:translateX() 只做了轮播和 鼠标进入停止轮播 ...
- myeclipse 控制台打印空指针 ,黏贴控制台sql到plsql有结果集,异常处理
信用公司框架,不够熟悉. 在完成嗲点登录后,写动态页面是遇到,了问题:myeclipse 控制台打印空指针 ,黏贴控制台sql到plsql有结果集,异常处理. 最后大神给看,在接口实现重写的方法里返回 ...
- 转载 ----HTML5 ---js实现json方式提交数据到服务端
json提交给服务器我们在提交之前需要通过js的相关函数来把数据转换成json格式的数据再进行post或get了,下面来看看. 大概需求就是前端要把数据组装成json,传给后端.首先,在客户端,通 ...
- VBA Excel 对比两列数据
Sub Md() ' ' Macro1 Macro ' 宏由 BX 录制,时间: 2012-6-8 ' 宏中的列数可以输入 A - IV 也可以输入 1-256 ' Dim i%, j%, i1%, ...
- JS产生随机一注彩票
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 部分MP4在谷歌浏览器上无法播放
Chrome浏览器支持HTML5,它支持原生播放部分的MP4格式(不用通过Flash等插件). 为什么是部分MP4呢?MP4有非常复杂的含义(见http://en.wikipedia.org/wiki ...
- The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name
可以强迫部署EntityFramework.SqlServer.dll这个文件到输出目录 找到1个老外的帖子,戳这里(本人测试无效,大家有可能试一下..) 解决方案以下: 在EF的上下文代码CS文件( ...