郑州网站推广排名公司,wordpress自动化框架,在线制图网页版,网站建设兆金手指花总“ 架构师的价值#xff0c;在于独立且理性的思考”想要写出灵活而且具有更好适应性的代码#xff0c;反射是首选方案。反射赋予程序在运行时动态创建实例的能力#xff0c;可以在程序运行时#xff08;而非编译时#xff09;获取实例类型#xff0c;获取元数据信息…“ 架构师的价值在于独立且理性的思考”想要写出灵活而且具有更好适应性的代码反射是首选方案。反射赋予程序在运行时动态创建实例的能力可以在程序运行时而非编译时获取实例类型获取元数据信息动态调用实例方法及属性实现在通常编程逻辑中无法完成的功能是编程体系中的高阶技能。反射的一大弊端是性能偏低但反射性能究竟低多少想必并非每个开发人员都了解那么本着严谨求实的精神我们来分析一下反射的执行效率及其优化方案。01—优化方案首先说一下反射的优化方案反射性能优化有以下几种方案委托ILEmit直接编写IL复杂度较高表达式树Expression复杂度相对较高元数据缓存02—性能测试接下来通过对一个属性的读写操作分析这几种方案的性能。下图是分别采用属性、委托、ILEmit、表达式树、元数据缓存、反射六种方案对一个属性进行读写操作的性能测试结果。 从测试结果可以看出通过反射读取属性值与直接通过属性读取耗时相差283倍通过反射写入属性值与直接通过属性写入耗时相差77倍相对来说反射的性能确实差了不少。再从绝对耗时角度看测试结果中操作耗时的单位是ns纳秒纳秒和秒的换算关系如下1s 1000 ms毫秒1000000 us微秒1000000000 ns纳秒取耗时最长的106 ns相当于0.000000106 s0.000106 ms也就是说即使在一个业务逻辑中调用10000次反射设置属性操作总耗时也只有1.06 ms通常一个逻辑操作耗时低于10 ms时性能优化的必要性不大一家之言仅供参考。对于性能的追求是每个技术人应当铭记于心的准则可以根据自己的技术能力业务场景以及任务排期选择采用不同的优化方案。03—方案分析分析一下这几种方案委托对比优化方案可知委托的性能最好读性能提高42倍写性能提高41倍。委托的实现难度较低并且代码可阅读性较好是首选优化方案。注意这里的委托是指delegate包括ActionFunc而不是Delegate直接使用Delegate的性能比反射还要低2倍需要将Delegate转换为特定类型的delegate才能起到性能提升的作用。由此也带来了委托的缺点通用性不强需要根据不同类型创建相应的委托。ILEmitILEmit相当于直接通过IL编写代码创建过程相对复杂代码可读性低编写难度高有兴趣的可以研究一下这个库Sigil。表达式树直接编写表达式树也有一定难度但相对于ILEmit要简单很多可以深入了解一下。对于属性的读写操作可以参考FastProperty。元数据缓存元数据缓存是最简单的方案在没有精力采用其他方案时是个不错的选择能得到30%的性能提升。重要说明此性能测试耗时只包含了不同方案下属性读写操作方法的耗时而不包含生成委托、构造ILEmit、构造表达式树的时间如果算上这部分时间那么这几种方案比直接使用PropertyInfo还要慢一倍这一点一定要注意。这就给我们的优化方案提出了新的挑战需要提前构建委托、Emit或表达式树并进行缓存以便后续操作使用这样才能达到性能优化的目的。04—总结我们常说手里拿个锤子看什么都像钉子。究其原因是因为我们手里只有锤子了解更多的方案扩大自己的知识边界让自己的工具箱中多几件工具那么面对不同问题场景时便可以多几种可选的应对方案。