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

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


当前回答

它是。但这取决于你要做什么。

我使用反射动态加载程序集(插件),它的性能“惩罚”不是问题,因为操作是我在应用程序启动期间所做的事情。

然而,如果你在一系列嵌套循环中反射,每个循环都有反射调用,我想说你应该重新审视你的代码:)

对于“几次”操作,反射是完全可以接受的,您不会注意到任何延迟或问题。它是一种非常强大的机制,甚至被。net使用,所以我不明白为什么你不应该尝试一下。

其他回答

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

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

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

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

和所有事情一样,这都是关于评估形势。在DotNetNuke中,有一个相当核心的组件叫做FillObject,它使用反射从数据箭头填充对象。

这是一个相当常见的场景,在MSDN上有一篇文章,使用反射将业务对象绑定到ASP。NET表单控件,涵盖了性能问题。

除了性能之外,我不喜欢在这种特定情况下使用反射的一件事是,它往往会降低快速理解代码的能力,对我来说,当你考虑到与强类型数据集或类似LINQ to SQL的数据集相比,你还失去了编译时的安全性,这似乎不值得付出努力。

它是。但这取决于你要做什么。

我使用反射动态加载程序集(插件),它的性能“惩罚”不是问题,因为操作是我在应用程序启动期间所做的事情。

然而,如果你在一系列嵌套循环中反射,每个循环都有反射调用,我想说你应该重新审视你的代码:)

对于“几次”操作,反射是完全可以接受的,您不会注意到任何延迟或问题。它是一种非常强大的机制,甚至被。net使用,所以我不明白为什么你不应该尝试一下。

您甚至不得不担心. net库内部为性能关键型代码所做的反射,这已经够糟糕的了。

下面的例子在当时(2008年)是过时的,但在最近的CLR版本中早就修复了。不过,总的来说,反思仍然是一件有点昂贵的事情!

举个例子:在高性能代码中,永远不要在lock (c#) / SyncLock (VB.NET)语句中使用声明为“Object”的成员。为什么?因为CLR不能锁定值类型,这意味着它必须执行运行时反射类型检查,以查看您的对象是否实际上是值类型而不是引用类型。

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.

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