F#5和F#工具更新

2020-05-21 03:10:15

今天我们很兴奋地宣布F#5的一些更新!从F#5预览版1开始,我们发布了很多预览版功能,自那次发布以来,它们一直在稳定下来。今天,我们很高兴地宣布对F#5做了一些小的补充,并讨论了我们一直在做的一些相当酷的性能工作。

如果您在Windows上使用Visual Studio,则需要同时安装.NET5预览版SDK和Visual Studio预览版。

您可以通过.NET5预览版SDK,或者通过.NET和Jupyter笔记本支持来使用F#5预览版。

如果你使用的是.NET5预览版SDK,可以查看一个样本库,该库展示了你可以用F#5做的一些事情。你可以尝试那里的每一个特性,而不是从头开始。

如果您更愿意在自己的项目中使用F#5,则需要添加一个值为PREVIEW的LangVersion属性。它应该看起来像这样:

或者,如果您使用的是Jupyter笔记本,并且想要更具交互性的体验,请查看一个显示相同功能、但输出更具交互性的示例笔记本。

此版本仅引入了一个新的语言功能。然而,到目前为止,我们发布的其他功能已经进一步稳定。在我们调用F#5功能完成之前,我们正在考虑更多的功能,当它们可用时,我们会发布更新。

现在,您可以通过实现接口的标准方法在F#中使用这些代码:

这将使F#开发人员安全地利用使用此功能的C#编写的包或其他组件,并期望调用者支持此功能。

不过,我们目前不支持生成默认实现。如果您想这样做,请在F#语言建议库中搜索或提交建议。

我们关注提高F#编译器和工具的性能已经有一段时间了,每次发布我们都会看到渐进式的进步。虽然性能总是可以提高的,但到目前为止,我们对自己的进步相当满意!

要演示不同之处,请查看FSharpPlus存储库的这个分支,这是一个代码库,它使用某些高级功能给F#编译器带来了极大的压力。您可以修改global.json文件以在您的计算机上指定.NET SDK。在本例中,它指定了.NET 5预览和Visual Studio 2019更新16.5发布的.NET Core 3.1 SDK。如果您的计算机上有这些SDK,您可以自己测试。

这是一个相当大的进步!然而,并不是所有挂钟时间的改善都归功于F#。NET工具链中的一切也都得到了改进。

为了更深入地了解这一点,我执行了与前面相同的步骤,但运行了以下命令来生成MSBuild性能摘要:

通过一次运行,我发现在FSC任务(调用F#编译器)中花费的CPU时间有以下不同:

(注意:因为MSBuild在可能的情况下是并行运行的,所以CPU时间比挂钟时间长得多。)

在构建相同的代码库时,F#编译器花费的时间减少了16%!在编译核心项目FSharpPlus.fsproj时,我个人看到编译时间提高了35%。具体的改进可能会因机器和构建的不同而有所不同,特别是如果构建过程当时在您的计算机上没有最高的优先级。不管这些注意事项如何,在构建此项目时,构建时间总是会得到改善。这一点在其他几个经过测试的OSS项目中也是如此。

如果你对完整的分类感到好奇,我把这两个日志都上传到了GitHub的要点中。

产生这样的结果是由很多因素造成的,其中之一是改进了编译期间读取和处理元数据的方式。

此外,我们令人惊叹的OSS贡献者不断发现一些小的低效,他们一直在努力帮助我们随着时间的推移而改进。这是我们非常感激的持续努力。

在这个版本中,编译器并不是唯一变得更快的东西。在整个Visual Studio 2019生命周期中,我们一直致力于提高Visual Studio Tools for F#的性能和可靠性,此版本也不例外!从Visual Studio2019更新16.6开始,查找所有引用和重命名等功能在扫描大型代码库时应该运行得更快,显示结果的速度也会更快。

为了演示这一点,我上传了两个视频,以FAKE(一个很大的F#OSS代码库)展示了在字符串类型上查找所有引用的操作。这是一个极端情况,并不代表查找所有引用的正常用法,但它有助于演示在少数情况下可能发生的情况,即您确实需要在大型代码库中查找对非常常见类型的引用。

第一个视频是Visual Studio 2019更新16.5(点击YouTube链接获取更高清晰度):

请注意,开始填写结果所需的时间要长得多,整个过程大约需要1分11秒才能完成。完成查找所有引用后,Visual Studio的内存使用量高达约1.75 GB:

第二个是最新的Visual Studio 2019更新16.6(点击YouTube链接获取更高清晰度):

如您所见,结果开始显示的速度要快得多,整个过程花了大约43秒才完成!运行完“查找所有引用”后,Visual Studio的内存使用量高达约1.2 GB:

负责在用户代码中查找符号并将其返回给请求与给定输入匹配的符号的调用者的核心组件。

Visual Studio组件,该组件在“查找所有引用”窗口中显示找到的符号,并根据列表中显示的源代码为文本着色。

除了Find All References这样的功能更快之外,用于运行它的内存量也显著减少,这在您使用大型代码库时非常重要。

就像编译器的性能一样,我们令人惊叹的OSS贡献者不断地在工具调用的代码中发现一些小的低效,他们已经随着时间的推移进行了清理和改进。我们感谢他们的贡献,并期待着有更多的机会与他们一起改进F#工具。

我们已经为F#5计划了更多令人惊叹的东西,我们迫不及待地想在它们完成后向你展示。在此之前,我们将重点关注几件事:

使Jupyter和Visual Studio Code Notebook中的F#成为数据科学和分析工作的最佳语言(有关这方面的更多信息,请参阅未来的更新!)

继续合并OSS贡献,并争取尽快将它们包含到版本中。

如果您想了解更详细的内容,可以查看F#开发资源库。我们现在通过每3周一期的GitHub问题来跟踪我们关注的工作,我们鼓励你们所有人都为清单上的事情提供意见,并让我们知道你们的想法。