创建直接发出 IL 的方法与构建表达式树之间是否存在性能差异?
2 回答
优秀而复杂的问题。在最近之前,Expression 根本无法处理所有场景 - 所以在许多情况下,这不是问题。这随着 Expression.Block 等的引入而改变。在大多数“常见”情况下,Expression 的使用可能绰绰有余,但我承认我没有精确的测量值,原因很简单,虽然我做了很多 IL,但我还针对没有像Expression(当然不是Expression.Block)这样的奢侈品的低级框架。我也倾向于使用复杂的“装饰器”方法,这些方法可以很好地在 IL 中堆叠体操,但不一定要用于 Expression干净地表达 - 我的 IL 往往很粗糙)。
对不起,我不能给你更多的数字数据——关键点:
- 如果您有较低级别的框架要求,则问题没有实际意义
- 否则,您必须配置文件
归根结底,表达式树的 API 实际上只是一个比 reelection.emit 更熟悉的 API,因此它们实际上是等效的,尽管我相信在表达式树中你不能通过直接反射.emit 来做很多事情。
Reflection.Emit 总体上是最快的,但与 for 循环通常比 foreach 更快的方式相同。在许多情况下,您可以使用反射编写比使用表达式 api 执行得更快的代码,但在大多数情况下,它们应该是等效的。
现在,由于几个原因,表达式 API 确实有助于成为一种更好的做事方式。
- 它的组合方式比使用直接反射.emit 更简单。您可以使用表达式树并重新编写它以添加一些逻辑,这比使用直接 IL 更容易
- 将来可能会添加优化,您可能无法理解使用方向反射.emit 时不会发生这些优化。
所以最终,我会说这是一次洗涤。如果它真的很关键,并且您非常了解反射.emit,您通常可以在 IL 中采用一些使用表达式 API 无法获得的快捷方式,但除此之外,在一般用法中,它们应该是相当等价的。