反思真的很慢,我不应该在它有意义时使用它吗?

时间:2009-03-05 20:53:02

标签: c# .net vb.net oop reflection

  

可能重复:
  How costly is .NET reflection?

我所拥有的problem的“优雅”解决方案是使用属性将类及其属性与另一个类相关联。问题是,要将它转换为另一个,我必须使用反射。我正在考虑将其托管在云端的服务器端应用程序。

我听过很多关于“反射很慢,不使用它”的隆隆声,慢得多慢?它是如此占用CPU密集度,以至于它会大大增加我的CPU时间,以至于我真的要付出我在云架构底部使用反射的决定吗?

5 个答案:

答案 0 :(得分:29)

如果您没有看到原始问题的更新:当您反映查找支持某个属性的所有类型时,您就有了使用缓存的绝佳机会。这意味着您不必在运行时多次使用反射。

回答一般问题,反射比原始编译方法调用慢,但它比访问数据库或文件系统要快得多,实际上所有的Web服务器都会一直这样做。

答案 1 :(得分:16)

它比文件系统访问快许多倍。

它比网络上的数据库访问快许多倍。

比将HTTP响应发送到浏览器要快许多倍。

答案 2 :(得分:8)

可能你甚至都不会注意到它。在考虑优化之前始终先进行分析。

答案 3 :(得分:4)

我想知道同样的事情;但事实证明,反思并不是那么糟糕。我找不到资源(当我找到它们时我会尝试列出它们),但我想我记得它读的速度可能慢了2倍到3倍。快速的50%或33%仍然很快。

另外,我在幕后ASP.net webforms和MVC做了一堆反思,所以它真的有多慢?

修改

以下是我记得阅读的一个资源:.Net Reflection and Performance

答案 4 :(得分:3)

嗯,如果可以的话,我会尽量避免反思,但如果我必须创建一个解决方案,并且反射给我一个解决手头问题的优雅方法,我会使用反射。

但是,必须告诉我,我认为反思不应该被用来做“肮脏的伎俩”。在这个时刻,我也正在研究一个解决方案,我使用自定义属性来装饰一些类,是的,我将不得不使用反射来了解一个类/属性/是否已经被我的自定义装饰属性。

我还认为这是'你做多少反思电话'的问题? 如果可以,我会尝试缓存我的结果。 就像,在我正在处理的解决方案中:在应用程序启动时,我检查某个程序集中的某些类型,这些类型是否已使用我的属性进行修饰,并且我将它们保存在字典中。