使用类型化与非类型化 F# 代码引用对运行时性能有何影响?

What are the runtime performance implications of using typed versus untyped F# code quotations?

我使用 F# Code Quotations 是为了通过 LINQ expression treesFSharp.Compiler.Services.

生成可执行的 .NET 库

我可以 author/create most 使用类型化引号所需的 AST,但我正在努力处理特定区域,因为表达式可以解析为多种类型 - 因此我正在考虑非类型化代码引用。

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

  1. 如果你的表达式可以解析为多种类型,它是元编程吗"code smell"?

  2. 如果我使用类型化与非类型化,它会对运行时性能(在 .NET 中)产生任何影响吗 quotations/expressions

如果您只是比较非类型化和类型化的 F# 引用(即 ExprExpr<'T> 类型),则不会有任何真正的区别。类型化引文的优点是它们可以在编译时(部分地)检查您是否正在构建正确的引文,但底层表示实际上完全相同。

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

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

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

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

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