我目前正在阅读 MSDN 文章“演练:创建 IQueryable LInQ 提供程序”,并且有很多使用 ExpressionVisitor。ExpressionVisitor 使用访问者模式遍历表达式树。
http://msdn.microsoft.com/en-us/library/bb546158.aspx
在我看来,像这样一遍又一遍地遍历表达式树对性能的影响很大。真的吗?在创建 IQueryProvider 时我应该关心这个吗?
我目前正在阅读 MSDN 文章“演练:创建 IQueryable LInQ 提供程序”,并且有很多使用 ExpressionVisitor。ExpressionVisitor 使用访问者模式遍历表达式树。
http://msdn.microsoft.com/en-us/library/bb546158.aspx
在我看来,像这样一遍又一遍地遍历表达式树对性能的影响很大。真的吗?在创建 IQueryProvider 时我应该关心这个吗?
基本上,是的。表达式树可能会变得非常大,因此遍历它们并可能由于更改而创建副本可能需要一段时间。LINQ to SQL 和 EF 在客户端上使用的 CPU 通常比在 SQL Server 上多,因为它们过度操纵表达式 AST。它真的很严重,并且在探查器跟踪中出现了很长时间。
是否重要取决于您执行此操作的频率以及您的提供商还做了什么。不知道还能说什么。没有操作本身是慢的或快的。这取决于您需要什么以及执行它的频率。
也就是说,表情访问者是一种优雅的模式,并且有自己的位置。
并不真地。使用访问者模式解析抽象语法树是非常标准的。通常,在制作 IQueryable 提供程序时,解析表达式树中的少数节点所花费的时间与获取数据所花费的时间相比完全相形见绌。