F# 10带来的性能提升
Source: InfoQ - Backend
.NET 10的发布带来了F#版本10。这是一个以调优为重点的更新,增强了语言的人体工程学水平,提高了性能,并优化了编译器行为,以适应日常的函数式开发。
对于习惯于F# 6-9模式的F#开发者来说,许多语言改进都集中在新语法或主要范式上。对于F# 10,重点转移了:与其引入全新的功能,团队更注重清晰度、一致性和大型代码库的性能基础。这里的价值不在于新功能,而在于打磨日常开发体验,这与.NET 10作为高性能、长期支持(LTS)版本的定位非常吻合。
在语言改进方面,F# 10引入了#warnon指令,与#nowarn配对,让开发者可以将编译器警告的抑制限制在离散的代码区域,而不是全局禁用它们。
开发者现在可以定义自动的公共属性,这些属性是私有可变的,使用member val X = ... with public get, private set,避免了以前需要的冗长的后端字段模式。
// F# 9
type Ledger() =
[] val mutable private _Balance: decimal
member this.Balance with public get() = this._Balance and private set v = this._Balance <- v
// F# 10
type Ledger() =
member val Balance = 0m with public get, private setF# 10允许用\[,减少了代码热点路径中的内存分配。其他.NET语言已经有这种优化一段时间,现在F#也与它们持平了。而不是堆分配的Option\]属性标记可选参数。在底层,编译器使用栈分配的ValueOption
在库和工具改进方面,使用任务表达式的异步代码现在可以使用and!关键字更简洁地等待任务。
F#10的性能优化包括更好的默认trimming链接文件,这些文件从发布的程序集中剥离未使用的元数据。如果解决方案使用参数PublishTrimmed=true发布,它可以减少文件开销。中间语言(IL)编译现在可以并行进行,减少了大型解决方案的编译时间。这是一个叫做true的设置。另一个优化是计算表达式中最终yield关键字的尾调用递归编译。
因为F# 10是一个精细化版本,而不是根本性的转变,所以升级到这一版一般是低风险的,但有一些兼容性注意事项需要了解。例如,作用域警告抑制功能改变了#nowarn和#warnon的工作方式,并引入了多行或空警告指令的破坏性行为。此外,一些功能(如并行编译)仅在预览语言版本中启用,因此可能尚未准备好用于生产。在大型F#代码库中的开发者应该测试修剪行为和异步工作流,以验证任何意外的变化(特别是与旧库一起使用时)。
关于新变化的社区反馈是有限的。在Reddit上,一位用户对没有宣布重大新F#功能表示轻微的惊讶。在X(前Twitter)上,一位开发者对计算表达式中现在可以不使用语法括号进行类型绑定表达了一些惊喜。
来自F#团队的微软的Tomáš Grošup在Visual Studio开发者社区论坛上指出,F#团队正在致力于在更大的程序中更好地管理线程,并将F#工具移动到自己的独立可执行文件中。这两个功能应该在2026年底左右落地。