面向 .netstandard2.0 但在 .NET 7 上运行的程序集是否会从最新的运行时获得所有性能提升?

Will assembly which targets .netstandard2.0 but runs on .NET 7 get all the performance boost from the latest runtime?

提问人:Pavel Voronin 提问时间:11/23/2022 更新时间:7/21/2023 访问量:304

问:

我可以选择将程序集定位为 .netstandard2.0 或 .net7.0如果我不需要 C# 的最新功能,那么在 .NET 上运行我的应用程序时,它最终会对性能产生任何影响吗?

AFAIK、JIT 和 BCL 中的类型由运行时提供,因此该领域的改进应该会对性能产生积极影响。

从理论上讲,C# 编译器可以发出 IL,而 IL 缺少一些由较新的运行时支持的新指令,因此 IL 代码可能比它本来的样子稍微不那么理想,如果 .NET7 是靶点。

我是否遗漏了任何可能阻碍性能的东西?

C# 性能 .NET 标准 中间语言

评论

1赞 canton7 11/23/2022
不是直接的 -- 例如,在很长一段时间内没有添加新的 IL 指令。您将错过较新运行时版本中的工具,这些工具可以让您编写更快的代码(如果您想这样做),例如 ref 类型、ref 返回等。您还将错过较新的语言功能,除非您 polyfill 较新的编译器版本所依赖的运行时部分(这不受支持,但在实践中运行良好)
1赞 Hans Passant 11/23/2022
没有区别,抖动仅在 CLR 解析引用后看到 .net7 程序集。没有“新指令”。
1赞 canton7 11/23/2022
@jdweng 您可以在 .net 7 运行时上运行面向 .net standard 的程序集。这就是 .net 标准的全部意义所在。
2赞 canton7 11/23/2022
@jdweng 不能在 .net 标准版上“运行”。.NET Standard 是一种 API 规范。库可以面向 .net 标准,这意味着它们将在实现该版本的 .net 标准的任何运行时上运行(包括 Mono、Xamarin 等)。请参阅文档。这是非常基本的东西。
2赞 Marc Gravell 7/22/2023
@jdweng你在这一点上是绝对错误的;请接受这一点 - 简单地以 NS2.0 为目标并在 Net7 上运行是微不足道的。您将获得每个运行时(JIT、GC 等)和 BC(库实现等)性能改进。您唯一无法使用的是代码中 ns2.0 不存在的新 API,这只是 API 定义(而不是实现)。它基本上是一个头文件。然而,BCL 可以使用所有这些 API(并且会这样做)——因为它是 net7 BCL。没有 ns2.0 运行时/BCL 这样的东西

答:

2赞 Batesias 7/21/2023 #1

是的,当从 .Net 7 应用程序运行时,您的库将受益于 .Net 7 性能改进。netstandard2.0

为了测试这一点,我在一个库中编写了一些基准代码(使用 Linq,它在 .Net 7 中得到了显着改进),然后我从 2 个单独的控制台应用程序(一个目标和另一个)引用该代码。 性能差异与此处描述的性能差异类似,即使 Linq 代码内置于单独的 dll 中也是如此。netstandard2.0net6.0net7.0netstandard2.0

此外,当我将库的目标从 更改为 时,基准测试会产生类似的结果。(有些测试更好,有些测试最差,所以我认为它在误差范围内。我不清楚一个是否比另一个更好,所以我个人会根据跨平台定位指南而不是性能来选择目标。netstandard2.0net7.0