当前位置:  开发笔记 > 编程语言 > 正文

.NET反射的"成本"是多少?

如何解决《.NET反射的"成本"是多少?》经验,为你挑选了2个好方法。

Reflection需要加载大量的类型元数据然后进行处理.这可能导致更大的内存开销和更慢的执行.根据这篇文章,属性修改慢约2.5x-3x,方法调用慢3.5x-4x.

这是一篇优秀的MSDN文章,概述了如何更快地进行反射以及开销在哪里.如果您想了解更多信息,我强烈建议您阅读.

还有一个复杂因素,反射可以添加到代码中,使其更加混乱,因此难以使用.像Scott Hanselman这样的人认为,通过使用反射,你经常会遇到比你解决的问题更多的问题.如果您的团队主要是初级开发人员,情况尤其如此.

如果您需要很多动态行为,最好还是研究DLR(动态语言运行时).随着.NET 4.0中的新变化,您可能希望了解是否可以将其中的一部分合并到您的解决方案中.VB和C#增加了对动态的支持,使得动态代码非常优雅,并且可以非常直接地创建自己的动态对象.

祝好运.

编辑:我在斯科特的网站上做了一些更多的探索,发现这个播客反思.我没有听过,但它可能值得.



1> smaclell..:

Reflection需要加载大量的类型元数据然后进行处理.这可能导致更大的内存开销和更慢的执行.根据这篇文章,属性修改慢约2.5x-3x,方法调用慢3.5x-4x.

这是一篇优秀的MSDN文章,概述了如何更快地进行反射以及开销在哪里.如果您想了解更多信息,我强烈建议您阅读.

还有一个复杂因素,反射可以添加到代码中,使其更加混乱,因此难以使用.像Scott Hanselman这样的人认为,通过使用反射,你经常会遇到比你解决的问题更多的问题.如果您的团队主要是初级开发人员,情况尤其如此.

如果您需要很多动态行为,最好还是研究DLR(动态语言运行时).随着.NET 4.0中的新变化,您可能希望了解是否可以将其中的一部分合并到您的解决方案中.VB和C#增加了对动态的支持,使得动态代码非常优雅,并且可以非常直接地创建自己的动态对象.

祝好运.

编辑:我在斯科特的网站上做了一些更多的探索,发现这个播客反思.我没有听过,但它可能值得.



2> Marc Gravell..:

你可以做很多事情来加速反思.例如,如果您正在进行大量的属性访问,那么HyperDescriptor可能会很有用.

如果您正在进行大量的方法调用,那么您可以使用方法将方法缓存到类型化的委托Delegate.CreateDelegate- 然后只进行一次类型检查等(期间CreateDelegate).

如果你正在做很多对象构造,那么Delegate.CreateDelegate就无济于事了(你不能在构造函数上使用它) - 但是(在3.5中)Expression可以用来做这个,再次编译成一个类型化的委托.

所以是的:反射很慢,但你可以在没有太多痛苦的情况下进行优化.


令人惊讶的是有多少人不了解Delegate.CreateDelegate,事实上它可能是有史以来最好的MSDN文档!
链接到“ CreateDelegate”的MSDN http://msdn.microsoft.com/zh-cn/library/system.delegate.createdelegate.aspx
推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有