我经常听说使用反射是多么糟糕。虽然我通常避免反思,也很少发现不反思就无法解决问题的情况,但我在想……

对于那些在应用程序中使用反射的人,您测量过性能影响吗?它真的那么糟糕吗?


当前回答

在Jeff Richter的演讲The Performance of Everyday Things中,他展示了通过反射调用一个方法要比正常调用慢1000倍。

Jeff的建议:如果需要多次调用该方法,请使用一次反射来找到它,然后将其分配给委托,然后调用委托。

其他回答

反射的代价很高,因为每当您请求与参数列表匹配的方法时,运行时必须进行许多检查。在内部的某个深处,存在一些代码,它们循环遍历一个类型的所有方法,验证其可见性,检查返回类型,并检查每个参数的类型。所有这些都需要时间。

当你在内部执行这个方法时,有一些代码会在执行实际的目标方法之前检查你传递了一个兼容的参数列表。

如果可能,总是建议缓存方法句柄,如果将来要不断地重用它。像所有好的编程技巧一样,避免重复通常是有意义的。在这种情况下,不断地查找具有特定参数的方法,然后每次都执行它将是一种浪费。

戳一下源代码,看看正在做什么。

As with all things in programming you have to balance performance cost with with any benefit gained. Reflection is an invaluable tool when used with care. I created a O/R mapping library in C# which used reflection to do the bindings. This worked fantastically well. Most of the reflection code was only executed once, so any performance hit was quite small, but the benefits were great. If I were writing a new fandangled sorting algorithm, I would probably not use reflection, since it would probably scale poorly.

很抱歉,我还没有完全回答你的问题。我的观点是,这并不重要。在适当的地方使用反射。它只是你需要学习如何以及何时使用的另一种语言功能。

如果将反射用于频繁创建对象,则它会对性能产生显著影响。我开发了一个基于复合UI应用程序块的应用程序,它严重依赖反射。通过反射创建对象时,有明显的性能下降。

但是在大多数情况下,使用反射是没有问题的。如果你只需要检查一些组装,我会推荐Mono。塞西尔,非常轻,速度很快

反射性能将取决于实现(重复调用应该被缓存,例如:entity.GetType(). getproperty ("PropName"))。由于我每天看到的大多数反射都用于从数据阅读器或其他存储库类型结构填充实体,所以我决定在反射用于获取或设置对象属性时对其性能进行基准测试。

我设计了一个测试,我认为是公平的,因为它缓存所有重复的调用,只乘以实际的SetValue或GetValue调用。性能测试的所有源代码都在bitbucket中:https://bitbucket.org/grenade/accessortest。审查是受欢迎和鼓励的。

我得出的结论是,在反射实现做得很好的情况下,在数据访问层中删除反射是不实际的,也不能提供明显的性能改进。

上图展示了我的小基准测试的输出,并显示了优于反射的机制,只有在100,000次循环之后才会明显表现出来。大多数dal一次只返回几百行或数千行,在这些级别反射执行得很好。

不严重。我从来没有在桌面开发中遇到过问题,除非,正如Martin所说,你在一个愚蠢的位置使用它。我听说很多人对它在桌面开发中的表现有完全不合理的担忧。

然而,在紧凑框架(我经常参与)中,它几乎是一种诅咒,在大多数情况下应该像瘟疫一样避免。我仍然可以不经常使用它,但我必须非常小心地使用它,这就不那么有趣了。:(