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

sir*_*lot 11 c# reflection reflection.emit expression-trees

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

Mar*_*ell 12

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

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

  • 如果你有低级框架要求,这个问题没有实际意义
  • 否则,你必须描述


Dar*_*opp 10

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

Reflection.Emit的是整体最快的,但以同样的方式,一个for循环比的foreach快于一般.在许多情况下,您可以编写使用reflect.emit执行速度比使用表达式api更快的代码,但在大多数情况下,它们应该是等效的.

现在,表达式API确实有助于成为一种更好的处理方式,原因有两个.

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

所以最终,我会说这是洗漱.如果它真的很关键并且你知道反射很好,你通常可以在IL中使用一些你不会使用表达式API的快捷方式,但除此之外,在一般用法中,它们应该相当等效.