2013-05-13 44 views
6

与创建表达式树相反,创建直接发送IL的方法之间是否存在性能差异?更快速:表达式树或手动发送IL

+4

既然我确定你已经试过了,请分享你的结果。 – 2013-05-13 20:29:36

+1

我们真的很想知道,表达式树的编译方式有一些根本性的区别。例如,在通过反射执行方法与如何执行方法之间存在根本区别,即从表达式树或通过动态绑定进行调用时。所以我想知道如果“编译”表达式树产生的结果与IL手工产生的结果有某种意义上的不同。 – sircodesalot 2013-05-13 20:35:00

+2

尝试两种方法,拿出秒表,你很快就会知道哪个更快。这是知道的唯一途径。 – 2013-05-13 20:56:50

回答

6

最终,表达树的API实际上只是一个比relect.emit更为熟悉的API,因此它们实际上是等效的,尽管我相信在表达式树中有许多东西可以通过直接反射来实​​现。发射。

Reflection.Emit是整体速度最快的,但同样的,for循环比foreach快一些。在很多情况下,您可以编写使用reflection.emit执行得更快的代码,而不是使用表达式api,但在大多数情况下,它们应该是等价的。

现在,API表达式的确适合做一些稍微好一点的事情,原因有两个。

  1. 它可以用比使用直接反射emit更简单的方式组合。您可以采用表达式树并重新编写它,以便比使用直接IL更容易地添加到某个逻辑中。使用方向反射时未必会发生的优化可能会在未来添加。发射。

所以最终我会说这是洗手。如果它非常重要,并且您知道reflection.emit很好,那么通常可以在IL中使用一些快捷方式,但不会使用表达式API,但除此之外,在一般用法中,它们应该是相当的。

+1

完美。这是我所追求的核心,谢谢。 – sircodesalot 2013-05-13 21:00:45

+1

没问题,祝你在旅途中进入reflection.emit和/或表达api世界。 – 2013-05-13 21:03:21

9

优秀和复杂的问题。在最近之前,表达式根本无法处理所有情况 - 所以在很多情况下这不是问题。这随着Expression.Block的引入而改变。在大多数“常见”情况下,表达式的用法可能绰绰有余,但我承认我没有精确的测量,仅仅因为当我做大量的IL时,我也针对没有像表达式这样的奢侈品的低级框架(当然不是Expression.Block)。我也倾向于使用复杂的“装饰者”方法,这些方法很好地适用于在IL中叠加体操,但不一定是表达式(事实上,如果您的IL不够典型以至于反射器等与它一起挣扎,那么它可能也不会映射干净地表达 - 我的IL往往很粗糙)。

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

  • 如果你有低级别的框架要求的问题是没有实际意义
  • 否则,你不得不简介