使用类型化和非类型化F#代码报价的运行时性能影响是什么?

时间:2015-06-30 08:12:34

标签: .net f#

我正在使用F# Code Quotations来通过LINQ expression treesFSharp.Compiler.Services生成可执行的.NET库。

我可以使用输入引文创建/创建大多数所需的AST,但由于表达式可以解析为多种类型,因此我正在努力解决特定区域问题 - 因此我正在考虑使用无类型的代码报价。

从安全的角度来看,我从this SO question欣赏了类型化表达式的优点,但我现在主要关心的是运行时性能。

  1. 如果您的表达式可以解析为多种类型,这是一种元编程“代码味道”吗?

  2. 如果我使用类型化和非类型化引用/表达式,那么它对运行时性能(在.NET中)是否有任何影响

1 个答案:

答案 0 :(得分:1)

如果您只是比较无类型和键入的F#引用(即ExprExpr<'T>类型),那么就没有任何真正的区别。类型引用的优点是它们可以(部分地)在编译时检查您正在构造正确的引用,但基础表示实际上完全相同。

如果查看definition of Expr<'T> in the source code,您会发现它实际上只是Expr上的一个轻量级包装器(它有一个额外的类型参数,但在其他方面代表完全相同的东西)。

如果您对更一般地编译代码感兴趣,那么这里有几点:

  • F#引用转换为LINQ表达式树,因此还有一个额外的步骤。此外,这会产生比F#编译器更慢的代码。

  • 使用LINQ表达式树比使用F#引用更难,因此在此方法和引用之间进行选择非常棘手。

  • F#编译器服务允许您直接访问编译器,但最好的文档API是编译字符串(仍然,这可能是更好的选择,因为它生成更快的代码)。