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

可能重复:
.NETreflection的代价是多少?

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

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

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

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

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

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

它比向浏览器发送HTTP响应快许多倍。

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

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

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

编辑

这是我记得读过的一个资源: .Net Reflection and Performance

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

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

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