我经常听到反射的糟糕程度。 虽然我一般都避免反思,很少发现没有它就无法解决问题的情况,我想知道......

对于那些在应用程序中使用过反射的人,你是否测量过性能命中率,是否真的如此糟糕?

===============>>#1 票数:148

在他的演讲“日常生活中的表现”中 ,杰夫里希特表明,通过反射调用方法比正常调用方法大约1000倍

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

===============>>#2 票数:128 已采纳

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

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

但是,如果你在一系列嵌套循环中反映每个反射调用,我会说你应该重新访问你的代码:)

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

===============>>#3 票数:59

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

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

我得出的结论是,它不实用,并且没有提供显着的性能改进来消除数据访问层中的反射,当反射实现完成时,该数据访问层返回少于100,000行。

时间(y)与填充实体数量的图表(x)

上图显示了我的小基准测试的输出,并显示了优于反射的机制,仅在100,000次循环标记后才显着。 大多数DAL一次只返回几百行或几千行,并且在这些级别上反射执行得很好。

===============>>#4 票数:14

如果你不在循环中,不要担心它。

===============>>#5 票数:12

我最相关的经验是编写代码来比较大型对象模型中属于同一类型的任何两个数据实体。 得到它的工作,尝试它,显然像狗一样跑。

我很沮丧,然后一夜之间意识到无论改变逻辑,我都可以使用相同的算法来自动生成进行比较但静态访问属性的方法。 我们花了很长时间才为此目的调整代码,并且我有能力对实体进行深度属性比较,静态代码只要对象模型发生变化就可以通过点击按钮进行更新。

我的观点是:在与同事的对话中,因为我曾多次指出他们使用反射可以自动生成代码进行编译而不是执行运行时操作,这通常值得考虑。

===============>>#6 票数:12

不是很大的。 我在桌面开发中从来没有遇到过这个问题,除非像Martin说的那样,你在一个愚蠢的位置使用它。 我听说很多人对其在桌面开发中的表现有完全不理性的担忧。

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

===============>>#7 票数:10

对于性能关键代码,你必须担心.NET库内部完成的反射,这已经够糟糕了。

以下示例已过时 - 当时为真(2008),但很久以前修复了更新的CLR版本。 但总的来说,反思仍然是一件有点代价的事情!

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

===============>>#8 票数:5

与编程中的所有内容一样,您必须平衡性能成本与获得的任何好处。 在小心使用时,反思是一种非常宝贵的工具。 我在C#中创建了一个O / R映射库,它使用反射来进行绑定。 这非常有效。 大多数反射代码只执行一次,所以任何性能影响都很小,但好处很大。 如果我正在编写一个新的fandangled排序算法,我可能不会使用反射,因为它可能会扩展得很差。

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

===============>>#9 票数:3

和所有事情一样,这都是关于评估情况的。 DotNetNuke中,有一个相当核心的组件FillObject ,它使用反射来填充数据行中的对象。

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

除了性能之外,我不喜欢在特定情况下使用反射的一件事是,它倾向于在快速浏览时降低了理解代码的能力,当你认为你也失去了编译时,这对我来说似乎不值得付出努力时间安全,而不是强类型数据集或类似LINQ to SQL

===============>>#10 票数:3

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

但是在大多数情况下,反射使用没有问题。 如果您只需要检查一些组件,我会推荐Mono.Cecil ,它非常轻巧,快速

===============>>#11 票数:3

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

当你在内部执行那个方法时,有一些代码可以执行诸如检查你在执行实际目标方法之前传递兼容的参数列表之类的东西。

如果可能的话,总是建议一个缓存方法句柄,如果将来要继续重用它。 像所有好的编程技巧一样,避免重复自己通常是有意义的。 在这种情况下,使用某些参数连续查找方法然后每次都执行它将是浪费。

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

===============>>#12 票数:2

反射不会大大降低应用的性能。 您可以通过不使用反射来更快地执行某些操作,但如果Reflection是实现某些功能的最简单方法,那么请使用它。 如果它成为一个性能问题,你总是可以从反射中重构代码。

===============>>#13 票数:1

我想你会发现答案是,这取决于。 如果你想把它放在你的任务列表应用程序中,这不是什么大问题。 如果你想把它放在Facebook的持久性库中,这是一个大问题。

  ask by Dan Herbert translate from so

未解决问题?本站智能推荐:

2回复

.NET反射-检查类型信息并检索属性性能

我看到了许多有关.NET反射性能的文章,并且我知道使用反射调用方法和检索属性值的性能成本很高,比直接调用慢2到3倍。 但是类型信息和属性呢? 我知道Types元数据已缓存在.NET中...所以我认为它不应该牺牲性能,并且类似于在字典或列表中进行搜索(但我不确定)... 检查类型信息以
3回复

在.Net效果中使用反射是否性能相当差? [重复]

可能重复: 反射的成本是多少? 为了使我的代码通用,我开始使用Reflection-在DTO对象中获取一些属性并进行设置- 与硬编码设置器相比,使用反射来获取属性和设置属性是否会严重影响性能?
2回复

反射性能问题

我似乎把头撞到了下面 我了解到,在随意运行的情况下进行反射可能会付出高昂的代价,而不会引起任何注意。 .NET反射的成本是多少? 但是说我有以下内容 ,并且打算在我的Web API端点上使用它。 像这样: 其中Map <>() 这是否会被视为会破坏性能
2回复

C#/ .NET动态调用方法的最佳方式

我们正在开发一个系统,它从tcp / ip流中读取命令,然后执行这些命令。 命令包括对对象的方法调用,该对象也由命令中的id int标识。 您可以将命令视为元素id的信息(我们要调用命令的寻址元素)和命令ID(寻址应该在元素上调用的方法)。 此外,我们还有一个问题,我们需要检查每个命令的某
2回复

在.NET中使用属性的性能开销

1 ..使用属性是否会导致性能开销? 考虑一个像这样的课程: 它有10个服装(属性是类,其中属性类本身比MyClass本身要大得多,例如: 2 ..每次实例化MyClass ,这些属性中的10个会成为内存开销吗? ( FirstAttribute是MyClass的大小的10倍
5回复

.NET反射的“成本”是多少? [重复]

这个问题已经在这里有了答案 : 6年前关闭。 可能重复: .NET反射的成本是多少? 我目前的编程思想是反思是我最好的朋友。 我经常使用它来动态加载允许“宽松
1回复

ASP.NET MVC 4反射对性能的影响

我是5天前开始的ASP.NET MVC开发的新手。 您可以说只是处于研发阶段。 我喜欢MVC的开发风格,但是当我的一位朋友告诉我,由于使用了反射,ASP.NET MVC的性能无法与WebForms相提并论时,我的困惑就开始了。 例如: MVC正在使用反射。 因此,据他介绍,我们应
5回复

(为什么)反射在.Net中如此昂贵? [重复]

可能重复: 反思的“成本”是多少? 有没有人对普遍接受的咒语有很好的解释: reflection == bad performance ? 例如,与直接访问所有属性相比,迭代类型的属性集合并从此类型的实例中提取所有属性值有多昂贵? 一个等级? 二? 它取决于什么?
7回复

为什么反射在.NET中表现不佳?

我有兴趣知道技术原因:为什么反射在.NET中表现不佳?
1回复

GetMethods中反射的开销是多少

我刚刚在我编写的几个解析器中重构了一段共同的代码。 该代码用于自动发现方法实现,它非常方便扩展现有的解析器或使用更多的DRY代码(特别是我正在单独处理这个项目): 现在我想在一个可能经常创建和销毁的类中使用此代码: 所以我在GetMethods的开销上徘徊,如果在.NET(4.