解析ExpressionTree是否昂贵?

时间:2013-02-02 06:40:22

标签: c# linq expression-trees

我目前正在阅读MSDN,Walkthrough: Creating an IQueryable LInQ Provider并且ExpressionVisitor有很多用途。

这让我很奇怪,使用它是否是一项昂贵的操作?

它和Reflection一样昂贵吗?

1 个答案:

答案 0 :(得分:1)

不,使用ExpressionVisitor遍历表达式树应该非常便宜。

解析表达式树根本不需要运行时成本。编译器完成了在编译时将表达式转换为对象树的所有工作。当在内存中创建有问题的对象时,甚至没有太多的运行时反射。当您看到如下方法调用时:

SomeMethod(Foo x => x.Property);

和SomeMethod的参数是Expression类型,然后编译器将代码转换为IL,就像你写的那样:

SomeMethod(new MemberExpression {
  Expression = new ParameterExpression("x", typeof(Foo)),
  Member = typeof(Foo).GetProperty("Property")
});

您可以查看生成的IL以获取完整的详细信息,或者查看Microsoft's documentation中的工作示例。 有一些反映(例如MemberExpressions持有PropertyInfo引用),但它都很快。

如果你有一个你担心的应用程序,你应该对它进行分析(例如,最新版本的Visual Studio有一个内置的性能分析器),看看哪些特定部分很慢。