什么更快:表达树或手动发射IL

时间:2013-05-13 20:27:45

标签: c# reflection expression-trees reflection.emit

创建直接发射IL的方法与构建表达式树相比,是否存在性能差异?

2 个答案:

答案 0 :(得分:12)

优秀而复杂的问题。在最近之前,Expression根本无法处理所有场景 - 因此在很多情况下这是一个非问题。这随着Expression.Block等的引入而改变。在大多数“常见”情况下,表达式使用可能绰绰有余,但我承认我没有精确的测量,仅仅因为我做了很多IL,我还针对没有像Expression这样的奢侈品的低级框架(当然也不是Expression.Block)。我也倾向于使用复杂的“装饰”方法,这些方法非常适合在IL中叠加体操,但不一定是表达式(事实上,如果你的IL非常不足以使反射器等人与之斗争,那么它可能也不会映射干净利落地表达 - 而我的IL往往非常粗糙。)

抱歉,我无法为您提供更多数字数据 - 关键点:

  • 如果您有低级框架要求,则问题是没有意义的
  • 否则,您必须个人资料

答案 1 :(得分:9)

最终,表达式树的API实际上只是一个比relection.emit更熟悉的API,因此它们实际上是等价的,尽管我相信你可以通过直接反射在表达式树中做很多事情。

Reflection.Emit总体上是最快的,但同样的方式是for循环比foreach 更快。在许多场景中,您可以编写使用reflection.emit执行速度比使用表达式api更快的代码,但在大多数情况下,它们应该等效。

现在,由于几个原因,表达式API确实有助于提高处理能力。

  1. 它的组合方式比使用直接反射更简单。您可以使用表达式树并重新编写它,以便比使用直接IL更容易添加某些逻辑
  2. 将来可能会添加一些您可能不了解的优化,使用方向反射时不会发生这种情况。发明。
  3. 所以最终,我会说这是洗漱。如果它真的很关键且你知道反射很好,你通常可以在IL中使用一些你不会使用表达式API的快捷方式,但除此之外,在一般用法中,它们应该相当等效。