创建直接发出IL的方法与构建表达式树之间是否存在性能差异?
这个问题很好,也很复杂。直到最近,Expression还不能处理所有的场景——所以在很多情况下,它不是一个问题。随着Expression的引入,这种情况发生了变化。块等。在大多数"常见"情况下,Expression的使用可能已经足够了,但我承认我没有精确的测量,原因很简单,虽然我做了很多IL,但我也针对底层框架,这些框架不像Expression(当然也不像Expression. block)那样奢侈。我还倾向于使用复杂的"装饰器"方法,这些方法可以很好地在IL中堆叠cao作,但不一定可以到Expression中(实际上,如果您的IL是非典型的,以至于反射器等都与之斗争,那么它可能也不能干净地映射到Expression中-并且我的IL往往相当粗糙)。
对不起,我不能给你更多的数字数据-关键点:
- 如果你有底层框架要求,这个问题是没有意义的
- 否则,您必须配置
最终,表达式树的API实际上只是一个更熟悉的反射API。因此它们实际上是等价的,尽管我相信有很多事情你不能在表达式树中做,你可以通过直接反射。emit.
反射。Emit总体上是最快的,但就像for循环一般比foreach 快一样。在许多情况下,您都可以使用反射编写执行速度更快的代码。比使用表达式api所能发出的要多,但在大多数情况下,它们应该是相等的。
现在,由于几个原因,表达式API确实使自己成为一种稍微更好的做事方式。
- 它的组合方式比直接使用reflection.emit更简单。您可以使用表达式树并重新编写它以添加一些逻辑,这比使用直接IL 要容易得多。
- 优化可能会在未来添加,你可能不明白,当使用方向反射。发射。
所以最终,我会说这是一场洗牌。如果它真的很关键,你知道反思。你通常可以在IL中使用一些使用表达式API无法获得的快捷方式,但除此之外,在一般使用中,它们应该是相当等效的。