容器是 .NET 团队的日常工作,既是构建基础结构的基础,又是产品方案,.NET 性能测试也在容器中完成。
在 .NET 6 中将针对如下项目改进容器支持:
改善容器的缩放支持,并更好地支持 Windows 进程隔离的容器。 我们还计划了一种针对密度和累加机器性能的新型容器性能测试。
使用 PGO 减小容器镜像的大小
通过使用 R2R 版本气泡来提高启动和吞吐量性能。
默认情况下,通过使用现代向量指令来提高启动和吞吐量性能。
[高级方案] 为 R2R 合成镜像启用大页面支持
除了第一条之外,上述所有特性都依赖 crossgen2 完成。虽然很多特性和容器没太多关系,但是 .NET 将会在容器中使用他们。
在某些情况下,例如版本气泡,容器可能是唯一默认启用功能的分发工具。
容器的一个重要优点是,与更通用的 .tar.gz,.deb 或 .msi 交付方式相比,可以以更“自以为是”的配置提供 .NET,例如提供性能更高配置的容器,但可能无法在所有情况下都可用(例如在旧硬件上)。
.NET 6 镜像将分别在 Alpine 3.13(或更高)、Debian 11(bullseye)和 Ubuntu 20.04 上构建。
主题:PGO - 利用运行时信息提升启动速度和吞吐量性能本次来介绍一下 PGO 这个主题,后续每个 Preview 都将会介绍一些主题。
PGO(Profile-Guided Optimization) 的目标是优化二进制内的原生代码,让其在 CPU 和其他方面的计算机上执行的效率更高。优化代码可以让程序速度更快,并能减少内存使用和硬盘使用。现在微软已经在 native runtime 上面使用了 PGO,这是由在 Windows、macOS 和 Linux 上使用的 C++ 编译器提供,虽然这部分内容很相关并重要,但是并不是这里的 PGO 所说的东西。
这里的 PGO 是指优化 RyuJIT(.NET 的 JIT)产生的本机代码。Crossgen 和 RyuJIT 已经支持了 PGO,但是在 .NET 6 中将在可用度和性能上大幅改善该特性。
其中一个 PGO 技术是冷热分离:将最常调用的代码放在一起(热),不常调用的代码放到另一边(冷)。理性情况下,由于已处于从磁盘加载的页面的相同物理顺序中,接下来一连串的方法调用或者基本块访问需要的代码已经被载入到了 CPU 的缓存中。这种情况下方法或者块的调用将非常快。除了上述的冷热之外,还引入了 “非常冷” 这一组,这一组代码将不会预编译任何的原生代码,只会在需要的时候被 JIT 编译,这么做将能在不牺牲主要性能的情况下减小程序体积。
PGO 这项技术虽然不仅仅只在 .NET 中有所应用,但是该项技术非常不流行,因为做起来非常有难度,而且这类工具通常很笨重,并且在处理过程中需要非常注意细节:开发者必须定期进行“训练”,在此过程中,需要在各种情况下运行程序,同时工具会收集程序的运行数据,然后把这些数据提供给编译器,编译器根据这些数据改善编译结果,开发者接着去验证结果。这一系列的过程非常麻烦且令人沮丧。
在 .NET 6 中,将计划做以下 PGO 相关的支持:
提供一组容易使用的工具用于 PGO 训练和数据分析
为 .NET 库公开发布分享训练数据,以让其他人能够使用这些数据
在生产环境中启用训练数据收集
在运行时允许 JIT 使用静态训练的数据
在运行时允许 JIT 生成和使用动态训练的数据(不需要手动训练)
PGO 将期望能得到 10% 的启动速度提升和吞吐量性能提升,对于计算不敏感的工作负载,提升将更为显著。
.NET 期望用两个大版本的时间完成此方面完整的企划。
.NET 6 TFM完整的 .NET TFM 将包含如下:
net6.0
net6.0-android
net6.0-ios
net6.0-maccatalyst
net6.0-macos
net6.0-tvos
net6.0-windows
通过类似 <TargetFramework>net6.0</TargetFramework> 的方式可以适配到不同的平台上。
.NET CLI.NET 6 对 CLI 也有不少改进
响应文件命令行支持响应文件,通过响应文件可以绕过控制台对于字符数量的限制,同时也能减少用户反复输入相同命令的麻烦。
响应文件的支持已经被添加到 .NET CLI 中,语法是 @file.rsp。而该文件本身就是简单的一行文本,会在命令行中被结构化,例如下图使用响应文件进行 dotnet build:
新指令dotnet suggest:用于搜索命令,例如 dotnet suggest buil 将返回 build、build-server 和 msbuild 等搜索结果
dotnet parse:用于解析命令,可用来分析为什么输入的命令有误等问题
库.NET 6 Preview 1 新增了一些 API:
System.Numerics 的新数学 APISinCos:用于同时计算 sin 和 cos
ReciprocalEstimate:用于估算 1 / x
ReciprocalSqrtEstimate:用于估算 1 / Sqrt(x)
Clamp, DivRem, Min 和 Max 支持 nint 和 nuint
Abs 和 Sign 支持 nuint
DivRem 返回元组的多态
Windows 访问控制列表的支持改进