想要写出灵活而且具有更好适应性的代码,反射是首选方案。
反射赋予程序在运行时动态创建实例的能力,可以在程序运行时(而非编译时)获取实例类型,获取元数据信息,动态调用实例方法及属性,实现在通常编程逻辑中无法完成的功能,是编程体系中的高阶技能。.
反射的一大弊端是性能偏低,但反射性能究竟低多少,想必并非每个开发人员都了解,那么本着严谨求实的精神,我们来分析一下反射的执行效率及其优化方案。
01—优化方案
-
委托 -
ILEmit(直接编写IL,复杂度较高) -
表达式树(Expression,复杂度相对较高) -
元数据缓存
02—性能测试
从测试结果可以看出:
通过反射读取属性值,与直接通过属性读取,耗时相差283倍,
通过反射写入属性值,与直接通过属性写入,耗时相差77倍,
相对来说,反射的性能,确实差了不少。
1s
= 1000 ms(毫秒)
= 1000000 us(微秒)
= 1000000000 ns(纳秒)
取耗时最长的106 ns,相当于0.000000106 s,0.000106 ms,也就是说,即使在一个业务逻辑中,调用10000次反射设置属性操作,总耗时也只有1.06 ms,通常一个逻辑操作耗时低于10 ms时,性能优化的必要性不大(一家之言,仅供参考)。
03—方案分析
-
委托
-
ILEmit
-
表达式树
-
元数据缓存
04—总结
我们常说:手里拿个锤子,看什么都像钉子。
究其原因是因为我们手里只有锤子,了解更多的方案,扩大自己的知识边界,让自己的工具箱中多几件工具,那么面对不同问题场景时,便可以多几种可选的应对方案。