本文摘自PHP中文网,作者零下一度,侵删。
很多人都说使用反射会有性能问题,那到底会比直接调用慢多少呢,下面就来测试一下。直接调用vs反射调用
下面就来写个demo来验证下直接调用和反射调用的性能差异,代码如下:
1 |
|
测试结果:
从100万次调用结果来看,确实就像很多人所说的,两者在性能上具有数量级的差距。
为什么反射有性能损失
既然反射性能有损失,那具体损失在哪里呢?
1,反射是基于程序集和元数据的,在使用反射的时候,会搜索元数据,而元数据是基于字符串的,并且无法预编译,所以这一系列的操作对性能有影响。
2,大量的装箱拆箱也对性能有影响。由于我们对目标类型是未知的,而且向方法传递的参数通常是object类型的,所以会有大量的装箱和拆箱。
反射性能优化方案
我们已经知道使用反射有性能问题,但是有些场景下又不得不使用反射技术,所以要想办法优化反射性能。
这里就引用老赵公开的System.Linq.Expressions.Expression<TDelegate>表达式树的类,与直接调用进行对比,代码如下:
1 |
|
测试结果:
哇,同样的100万次调用,使用DynamicMethodExecutor调用跟直接调用的性能相差无几。
附DynamicMethodExecutor的封装代码:
1 |
|
除了使用linq的表达式树生成Delegate的方法外,还有比如,CodeDom生成代码并动态编译,或者使用Emit来直接编写IL的方法来提高反射的性能,但是相对来说,上面这个方法是最简单的。
至此,整个反射的总结就完成了!
参考文章
方法的直接调用,反射调用与……Lambda表达式调用
C#基础知识梳理系列十五:反射
二、什么是反射、反射可以做些什么
以上就是直接调用vs反射调用实例教程的详细内容!
相关阅读 >>
更多相关阅读请进入《直接》频道 >>
C#高级编程(第11版) C# 7 & .NET Core 2.0(.NET开发经典名著)
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。