12

创建直接发出 IL 的方法与构建表达式树之间是否存在性能差异?

4

2 回答 2

15

优秀而复杂的问题。在最近之前,Expression 根本无法处理所有场景 - 所以在许多情况下,这不是问题。这随着 Expression.Block 等的引入而改变。在大多数“常见”情况下,Expression 的使用可能绰绰有余,但我承认我没有精确的测量值,原因很简单,虽然我做了很多 IL,但我还针对没有像Expression(当然不是Expression.Block)这样的奢侈品的低级框架。我也倾向于使用复杂的“装饰器”方法,这些方法可以很好地在 IL 中堆叠体操,但不一定要用于 Expression干净地表达 - 我的 IL 往往很粗糙)。

对不起,我不能给你更多的数字数据——关键点:

  • 如果您有较低级别的框架要求,则问题没有实际意义
  • 否则,您必须配置文件
于 2013-05-13T20:42:43.747 回答
13

归根结底,表达式树的 API 实际上只是一个比 reelection.emit 更熟悉的 API,因此它们实际上是等效的,尽管我相信在表达式树中你不能通过直接反射.emit 来做很多事情。

Reflection.Emit 总体上是最快的,但与 for 循环通常比 foreach 更快的方式相同。在许多情况下,您可以使用反射编写比使用表达式 api 执行得更快的代码,但在大多数情况下,它们应该是等效的。

现在,由于几个原因,表达式 API 确实有助于成为一种更好的做事方式。

  1. 它的组合方式比使用直接反射.emit 更简单。您可以使用表达式树并重新编写它以添加一些逻辑,这比使用直接 IL 更容易
  2. 将来可能会添加优化,您可能无法理解使用方向反射.emit 时不会发生这些优化。

所以最终,我会说这是一次洗涤。如果它真的很关键,并且您非常了解反射.emit,您通常可以在 IL 中采用一些使用表达式 API 无法获得的快捷方式,但除此之外,在一般用法中,它们应该是相当等价的。

于 2013-05-13T20:59:21.333 回答