创建直接发射IL的方法与构建表达式树相比,是否存在性能差异?
答案 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确实有助于提高处理能力。
所以最终,我会说这是洗漱。如果它真的很关键且你知道反射很好,你通常可以在IL中使用一些你不会使用表达式API的快捷方式,但除此之外,在一般用法中,它们应该相当等效。