我正在使用F# Code Quotations
来通过LINQ expression trees
或FSharp.Compiler.Services
生成可执行的.NET库。
我可以使用输入引文创建/创建大多数所需的AST,但由于表达式可以解析为多种类型,因此我正在努力解决特定区域问题 - 因此我正在考虑使用无类型的代码报价。
从安全的角度来看,我从this SO question欣赏了类型化表达式的优点,但我现在主要关心的是运行时性能。
如果您的表达式可以解析为多种类型,这是一种元编程“代码味道”吗?
如果我使用类型化和非类型化引用/表达式,那么它对运行时性能(在.NET中)是否有任何影响
答案 0 :(得分:1)
如果您只是比较无类型和键入的F#引用(即Expr
和Expr<'T>
类型),那么就没有任何真正的区别。类型引用的优点是它们可以(部分地)在编译时检查您正在构造正确的引用,但基础表示实际上完全相同。
如果查看definition of Expr<'T>
in the source code,您会发现它实际上只是Expr
上的一个轻量级包装器(它有一个额外的类型参数,但在其他方面代表完全相同的东西)。
如果您对更一般地编译代码感兴趣,那么这里有几点:
F#引用转换为LINQ表达式树,因此还有一个额外的步骤。此外,这会产生比F#编译器更慢的代码。
使用LINQ表达式树比使用F#引用更难,因此在此方法和引用之间进行选择非常棘手。
F#编译器服务允许您直接访问编译器,但最好的文档API是编译字符串(仍然,这可能是更好的选择,因为它生成更快的代码)。