反射和emit反射问题

mirrorspace 2016-08-02 05:44:01
各位好:

程序中使用到了反射,其实也就用了这个

// 建对象
T classtmp = System.Activator.CreateInstance<T>();
//用这个来取得属性值
System.Reflection.PropertyInfo prop=classtmp .GetType().GetProperty("属性名")
prop.SetValue(classtmp ,"属性值")

// 主要也就是为了动态给对象的属性赋值 ,对象的类都是提前建立好的.

但说是这种方法效率不高,如果使用下面这个程序集的话,效率会大大提高.
System.Reflection.Emit

看了相关的资料和一些代码,还是没搞明白这是什么.
如果要用这种emit的话,那它是怎么给动态建类,还要给属性取值赋值的呢
...全文
188 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2016-08-04
  • 打赏
  • 举报
回复
Emit可以在运行时通过构造IL代码序列动态创建方法,经由JIT编译以后变成机器代码指令;但是这个过程本身开销非常大,所以需要缓存这个方法重复调用才有意义。 另外正常情况下,这个动态创建的方法只能以委托的形式使用,而委托与普通方法调用本身就存在一定的性能差距。
mirrorspace 2016-08-04
  • 打赏
  • 举报
回复
引用 6 楼 bigbaldy 的回复:
Emit并没有加快速度,反射的确影响性能,所以通过生成一个动态方法的方式缓存了反射的结果,使得反射的过程只需要执行一次 例如我获取某属性的set方法并调用,我可以生成动态方法,并emit一条指令如下:

il.Emit(OpCodes.Callvirt, pc.PropertyInfo.GetSetMethod(true));
这样将来调用动态方法的时候pc.PropertyInfo.GetSetMethod(true)就不会再执行了 总之一句话,并不是emit提高了性能,而是通过这种方式使得原本会多次调用的反射只会调用一次,仅此而已 你要是不嫌麻烦,可以不用emit实现的,就是个缓存而已,使用动态方法,用emit是图省事 如果你还不明白,看看PetaPoco这个超轻量级的orm是如何实现的肯定就能明白了
感谢 我想花些时间看看 PetaPoco 这个东西. 目前是知道反射确实有性能不高的问题,为了提高效率要研究下
bigbaldy 2016-08-03
  • 打赏
  • 举报
回复
一句话总结:用emit就是使用创建动态方法的方式缓存了耗时操作的结果,仅此而已!
bigbaldy 2016-08-03
  • 打赏
  • 举报
回复
引用 9 楼 slyzly 的回复:
[quote=引用 7 楼 bigbaldy 的回复:] 准确的说是pc.PropertyInfo的值不需要每次都通过反射获取,获取了一次后,该值已经被缓存在动态方法里面了
看样子也只能像你这样解释了,我也有些不明白为什么emit会比较高效,按理说都是生成的il代码 下面这篇文字也没有彻底解释清楚,尤其是这句直接生成il运行,是说直接生成了调用的cpu指令? 所以,我们的.NET程序最终都是以这些中间语言存储起来的,在运行后,又由即时编译器直接转换成真正的机器语言执行. emit这种优势在于可以在程序动态运行的过程中,直接生成IL运行(可谓灵活且不失高效) http://www.cnblogs.com/humble/archive/2012/11/25/2787738.html[/quote] 不是CPU指令,CPU指令是由clrjit.dll中的compileMethod方法最终生成的,emit就是直接用IL写代码而已,这样就可以直接把耗时的操作的结果以IL的形式写成动态方法,再次调用时就省了这部分时间。 所以说高效不高效与emit没有任何关系,反过来说emit只是实现高效的一种方式而已,不是说用了它就高效了
事理 2016-08-03
  • 打赏
  • 举报
回复
引用 7 楼 bigbaldy 的回复:
准确的说是pc.PropertyInfo的值不需要每次都通过反射获取,获取了一次后,该值已经被缓存在动态方法里面了
看样子也只能像你这样解释了,我也有些不明白为什么emit会比较高效,按理说都是生成的il代码 下面这篇文字也没有彻底解释清楚,尤其是这句直接生成il运行,是说直接生成了调用的cpu指令? 所以,我们的.NET程序最终都是以这些中间语言存储起来的,在运行后,又由即时编译器直接转换成真正的机器语言执行. emit这种优势在于可以在程序动态运行的过程中,直接生成IL运行(可谓灵活且不失高效) http://www.cnblogs.com/humble/archive/2012/11/25/2787738.html
Poopaye 2016-08-03
  • 打赏
  • 举报
回复
引用 4 楼 mirror030 的回复:
[quote=引用 3 楼 shingoscar 的回复:] 我想知道你是从哪听说的?不会是你自己想出来的吧
不是自己想的.是好多讲EMIT的文章都讲过这两者的差异. 也有测试数据,一般的反射给属性取赋值要比EMIT这种的慢好多倍.我自己不知道怎么证实它. 为了提高反射效率,才想了解一下EMIT的[/quote] 所以你说的好多讲emit的文章在哪里,我想拜读一下
bigbaldy 2016-08-03
  • 打赏
  • 举报
回复
准确的说是pc.PropertyInfo的值不需要每次都通过反射获取,获取了一次后,该值已经被缓存在动态方法里面了
bigbaldy 2016-08-03
  • 打赏
  • 举报
回复
Emit并没有加快速度,反射的确影响性能,所以通过生成一个动态方法的方式缓存了反射的结果,使得反射的过程只需要执行一次 例如我获取某属性的set方法并调用,我可以生成动态方法,并emit一条指令如下:

il.Emit(OpCodes.Callvirt, pc.PropertyInfo.GetSetMethod(true));
这样将来调用动态方法的时候pc.PropertyInfo.GetSetMethod(true)就不会再执行了 总之一句话,并不是emit提高了性能,而是通过这种方式使得原本会多次调用的反射只会调用一次,仅此而已 你要是不嫌麻烦,可以不用emit实现的,就是个缓存而已,使用动态方法,用emit是图省事 如果你还不明白,看看PetaPoco这个超轻量级的orm是如何实现的肯定就能明白了
mirrorspace 2016-08-03
  • 打赏
  • 举报
回复
引用 1 楼 xunzaosiyecao 的回复:
你遇到性能瓶颈了吗? 效率不高,有多低?你测试过?
没有测试过.只是看了一些别人人测试数据.
mirrorspace 2016-08-03
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
我想知道你是从哪听说的?不会是你自己想出来的吧
不是自己想的.是好多讲EMIT的文章都讲过这两者的差异. 也有测试数据,一般的反射给属性取赋值要比EMIT这种的慢好多倍.我自己不知道怎么证实它. 为了提高反射效率,才想了解一下EMIT的
Poopaye 2016-08-02
  • 打赏
  • 举报
回复
我想知道你是从哪听说的?不会是你自己想出来的吧
秋的红果实 2016-08-02
  • 打赏
  • 举报
回复
没听说过Emit 频繁使用reflection、类型很复杂时才会有效率问题,放心使用吧
衣舞晨风 2016-08-02
  • 打赏
  • 举报
回复
你遇到性能瓶颈了吗? 效率不高,有多低?你测试过?

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧