使用类型化与非类型化 F# 代码引用对运行时性能有何影响?
What are the runtime performance implications of using typed versus untyped F# code quotations?
我使用 F# Code Quotations
是为了通过 LINQ expression trees
或 FSharp.Compiler.Services
.
生成可执行的 .NET 库
我可以 author/create most 使用类型化引号所需的 AST,但我正在努力处理特定区域,因为表达式可以解析为多种类型 - 因此我正在考虑非类型化代码引用。
我很欣赏 this SO question 从安全的角度来看类型化表达式的优点,但此时我主要关心的是运行时性能。
如果你的表达式可以解析为多种类型,它是元编程吗"code smell"?
如果我使用类型化与非类型化,它会对运行时性能(在 .NET 中)产生任何影响吗 quotations/expressions
如果您只是比较非类型化和类型化的 F# 引用(即 Expr
和 Expr<'T>
类型),则不会有任何真正的区别。类型化引文的优点是它们可以在编译时(部分地)检查您是否正在构建正确的引文,但底层表示实际上完全相同。
如果您查看 definition of Expr<'T>
in the source code,您会发现它实际上只是 Expr
的轻量级包装器(它有一个额外的类型参数,但在其他方面表示完全相同的东西)。
如果您对更一般地编译代码感兴趣,那么这里有几点:
F# 引用转换为 LINQ 表达式树,因此还有一个额外的步骤。此外,这生成的代码比 F# 编译器慢。
使用 LINQ 表达式树比使用 F# 引用更难,因此在这种方法和引用之间进行选择很棘手。
F# 编译器服务让您可以直接访问编译器,但最好的文档 API 是编译字符串(不过,这可能是更好的选择,因为它生成的代码更快) .
我使用 F# Code Quotations
是为了通过 LINQ expression trees
或 FSharp.Compiler.Services
.
我可以 author/create most 使用类型化引号所需的 AST,但我正在努力处理特定区域,因为表达式可以解析为多种类型 - 因此我正在考虑非类型化代码引用。
我很欣赏 this SO question 从安全的角度来看类型化表达式的优点,但此时我主要关心的是运行时性能。
如果你的表达式可以解析为多种类型,它是元编程吗"code smell"?
如果我使用类型化与非类型化,它会对运行时性能(在 .NET 中)产生任何影响吗 quotations/expressions
如果您只是比较非类型化和类型化的 F# 引用(即 Expr
和 Expr<'T>
类型),则不会有任何真正的区别。类型化引文的优点是它们可以在编译时(部分地)检查您是否正在构建正确的引文,但底层表示实际上完全相同。
如果您查看 definition of Expr<'T>
in the source code,您会发现它实际上只是 Expr
的轻量级包装器(它有一个额外的类型参数,但在其他方面表示完全相同的东西)。
如果您对更一般地编译代码感兴趣,那么这里有几点:
F# 引用转换为 LINQ 表达式树,因此还有一个额外的步骤。此外,这生成的代码比 F# 编译器慢。
使用 LINQ 表达式树比使用 F# 引用更难,因此在这种方法和引用之间进行选择很棘手。
F# 编译器服务让您可以直接访问编译器,但最好的文档 API 是编译字符串(不过,这可能是更好的选择,因为它生成的代码更快) .