【问题标题】:Is it normal that Ready To Run publishing takes 10 times longer?Ready To Run 发布需要 10 倍的时间是否正常?
【发布时间】:2021-01-07 19:20:59
【问题描述】:

编辑:与此同时,我打开了an issue in the MSBuild GitHub project,因为这个话题已经 10 天没有收到任何回复了。

编辑 2:在下面查看我自己的答案。

我正在尝试构建一个面向 ASP.NET Core 3.1 的应用程序,启用 R2R publishing 以加速自动化 UI 测试的执行。 该解决方案有大约 30 个项目(+10 个测试项目),LOC 为 181k,根据 VS 代码指标,其中 54k 是可执行的。

我的机器有 4 核 / 8 线程,我进行了以下测量:

  1. 不使用 R2R 发布平均需要 2 分钟:
dotnet publish Solution.sln --configuration Release --output "publish" --runtime win-x64
  1. 对于 R2R,它介于 25 到 35 分钟之间:
dotnet publish Solution.sln --configuration Release --output "publish" --runtime win-x64 -p:PublishReadyToRun=true

在我测试的前几次迭代中,Windows Defender 明显受到干扰(持续旋转一两秒),但我暂时忽略了 crossgen.exe。 查看任务管理器,我还注意到 crossgen.exe 不会同时生成超过 4 个实例(这可能是对物理内核的硬限制吗?),但我没有看到其中超过 3 个在同时。此外,crossgen 进程的 CPU 使用率大多是几秒爆发到 15-20%(与总 CPU 使用率相比)。因此,“正常运行时间”和强度远低于 MSBuild 在正常构建过程中产生的结果。

我的 .NET 信息:

.NET SDK (reflecting any global.json):
 Version:   5.0.101
 Commit:    d05174dc5a

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.19042
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\5.0.101\

Host (useful for support):
  Version: 5.0.1
  Commit:  b02e13abab

.NET SDKs installed:
  5.0.101 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.All 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.23 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.23 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.10 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.23 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.10 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.1.10 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

所以我的问题是:我在工具/配置方面是否遗漏了什么或做错了什么? 10 倍的构建时间增加似乎相当极端......

【问题讨论】:

  • 我也经历过类似的差异。奇怪的是,到目前为止,R2R 发布并没有像标准一样使用 CPU,我的旧 4 核运行利用率约为 60-70%,而许多其他东西也在运行(通常在标准发布中 > 90%,但差异很大)。似乎它基本上是一个一个地遍历解决方案中的每个项目,而不是并行化的。

标签: asp.net .net asp.net-core .net-core asp.net-core-3.1


【解决方案1】:

看起来“-graph”开关 (source) 解决了问题(也可以传递给 dotnet.exe),使发布时间达到合理水平(几分钟)。没有它,解决方案中的每个项目都将独立构建,因此每次出现依赖项时都会重新构建。

另外,请查看this GitHub issue in the .NET Runtime repository 以获取(希望)来自 .NET 团队的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2020-08-30
    • 2010-12-19
    • 1970-01-01
    • 2017-02-28
    • 2022-11-04
    相关资源
    最近更新 更多