为什么使用Expression<TDelegate>.Compile()编译的代码比普通C#慢?

3

我重写了一个使用反射的方法,用新代码使用System.Linq.Expressions类和Expression.Compile()方法。

正如预期的那样,使用这种方式程序会比使用反射快得多。

我还将同一方法重写为普通的C#代码进行比较,结果表明,用C#编写的代码比使用Expression.Compile()编译的代码快4倍。在我的情况下,该方法被循环调用了成千上万次。

请注意,我从我的分析中删除了第一次调用,以确保我不测量编译时间。因此,我只需要一次编译表达式,然后调用它数千次。

为什么使用Expression.Compile()编译的代码比纯C#更慢呢?

1个回答

3
已经注意到你必须缓存并重新使用委托,最好忽略第一次运行。要给出完整的答案,我们需要看到一个具体的例子。实际上,我已经看到过一些例子,由于设置了不同的IL标志,它们比较
所以:这将取决于代码。我猜测你的例子做了一些转换或操作符,而C#编译器处理方式不同(优化),但Expression必须以通用的方式处理(因为它是语言无关的)。
另一个因素是如何处理字面量和捕获。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接