Tom*_*son 72 .net c# reflection optimization
可能重复:
.NET反射的代价是多少?
我目前处于一种编程心态,反思是我最好的朋友.我使用它来动态加载内容,允许"松散实现"而不是严格的接口,以及许多自定义属性.
使用反射的"实际"成本是多少?
经常反映的类型是否值得缓存反射,例如我们自己的LINQ DAL目标代码在表定义的所有属性上?
缓存内存占用量是否会超过反射CPU的使用量?
sma*_*ell 56
Reflection需要加载大量的类型元数据然后进行处理.这可能导致更大的内存开销和更慢的执行.根据这篇文章,属性修改慢约2.5x-3x,方法调用慢3.5x-4x.
这是一篇优秀的MSDN文章,概述了如何更快地进行反射以及开销在哪里.如果您想了解更多信息,我强烈建议您阅读.
还有一个复杂因素,反射可以添加到代码中,使其更加混乱,因此难以使用.像Scott Hanselman这样的人认为,通过使用反射,你经常会遇到比你解决的问题更多的问题.如果您的团队主要是初级开发人员,情况尤其如此.
如果您需要很多动态行为,最好还是研究DLR(动态语言运行时).随着.NET 4.0中的新变化,您可能希望了解是否可以将其中的一部分合并到您的解决方案中.VB和C#增加了对动态的支持,使得动态代码非常优雅,并且可以非常直接地创建自己的动态对象.
祝好运.
编辑:我在斯科特的网站上做了一些更多的探索,发现这个播客反思.我没有听过,但它可能值得.
Mar*_*ell 17
你可以做很多事情来加速反思.例如,如果您正在进行大量的属性访问,那么HyperDescriptor可能会很有用.
如果您正在进行大量的方法调用,那么您可以使用方法将方法缓存到类型化的委托Delegate.CreateDelegate- 然后只进行一次类型检查等(期间CreateDelegate).
如果你正在做很多对象构造,那么Delegate.CreateDelegate就无济于事了(你不能在构造函数上使用它) - 但是(在3.5中)Expression可以用来做这个,再次编译成一个类型化的委托.
所以是的:反射很慢,但你可以在没有太多痛苦的情况下进行优化.