如何实现直接调用vs反射调用的实例教程?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
目前创新互联已为超过千家的企业提供了网站建设、域名、虚拟空间、成都网站托管、企业网站设计、富裕网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
直接调用vs反射调用
下面就来写个demo来验证下直接调用和反射调用的性能差异,代码如下:
1 namespace ConsoleApplication7 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //比较直接调用和反射调用的性能差异 8 //7ms vs 365ms 9 int times = 1000000;10 var program = new Program();11 CodeTimerHelper.Initialize();12 13 CodeTimerHelper.Time("直接调用", times, () =>14 {15 program.Call();16 });17 18 var t = typeof(Program);19 var obj = Activator.CreateInstance(t);20 CodeTimerHelper.Time("反射调用", times, () =>21 {22 t.InvokeMember("Call", BindingFlags.InvokeMethod, null, obj, null);23 });24 25 Console.ReadKey();26 }27 28 /// 29 /// 测试方法30 /// 31 public void Call()32 {33 }34 35 }36 }
测试结果:
![如何实现直接调用vs反射调用的实例教程](/upload/otherpic51/26728.jpg)
从100万次调用结果来看,确实就像很多人所说的,两者在性能上具有数量级的差距。
为什么反射有性能损失
既然反射性能有损失,那具体损失在哪里呢?
1,反射是基于程序集和元数据的,在使用反射的时候,会搜索元数据,而元数据是基于字符串的,并且无法预编译,所以这一系列的操作对性能有影响。
2,大量的装箱拆箱也对性能有影响。由于我们对目标类型是未知的,而且向方法传递的参数通常是object类型的,所以会有大量的装箱和拆箱。
反射性能优化方案
我们已经知道使用反射有性能问题,但是有些场景下又不得不使用反射技术,所以要想办法优化反射性能。
这里就引用老赵公开的System.Linq.Expressions.Expression表达式树的类,与直接调用进行对比,代码如下:
1 //3,基于表达式树2 var methodInfo = t.GetMethod("Call");3 var executor = new DynamicMethodExecutor(methodInfo);4 CodeTimerHelper.Time("Dynamic executor", times, () =>5 {6 executor.Execute(obj, null);7 });
测试结果:
![如何实现直接调用vs反射调用的实例教程](/upload/otherpic51/26729.jpg)
哇,同样的100万次调用,使用DynamicMethodExecutor调用跟直接调用的性能相差无几。
附DynamicMethodExecutor的封装代码:
1 /// 2 /// 3 /// 4 public class DynamicMethodExecutor 5 { 6 private Func
除了使用linq的表达式树生成Delegate的方法外,还有比如,CodeDom生成代码并动态编译,或者使用Emit来直接编写IL的方法来提高反射的性能,但是相对来说,上面这个方法是最简单的。
至此,整个反射的总结就完成了!
参考文章
方法的直接调用,反射调用与……Lambda表达式调用
C#基础知识梳理系列十五:反射
二、什么是反射、反射可以做些什么
看完上述内容,你们掌握如何实现直接调用vs反射调用的实例教程的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
网页名称:如何实现直接调用vs反射调用的实例教程
本文URL:
http://6mz.cn/article/gsohoh.html