C# 在UWP中加速编译?

C# 在UWP中加速编译?,c#,.net,visual-studio,uwp,C#,.net,Visual Studio,Uwp,在WPF中工作了很长时间后,我正在研究UWP,编译速度非常慢 我理解为什么版本编译很慢(net本机编译),但在调试中禁用了它,但在F5和屏幕上显示的应用程序之间仍然需要很多时间,即使对于空白应用程序也是如此 是否有任何方法可以加快速度(即使以运行时性能为代价)?当你习惯于C语言时,这真的很难处理,因为C语言在每一个小的变化后都会给你极快的编译时间和测试 例如,只需在一个非常简单的(4个页面,每个MarkupCompilePass1: >XamlPreCompile: >MarkupCompile

在WPF中工作了很长时间后,我正在研究UWP,编译速度非常慢

我理解为什么版本编译很慢(net本机编译),但在调试中禁用了它,但在F5和屏幕上显示的应用程序之间仍然需要很多时间,即使对于空白应用程序也是如此

是否有任何方法可以加快速度(即使以运行时性能为代价)?当你习惯于C语言时,这真的很难处理,因为C语言在每一个小的变化后都会给你极快的编译时间和测试

例如,只需在一个非常简单的(4个页面,每个<200行xaml,几乎0个C#)uwp项目上单击鼠标右键并重新构建,调试几乎只需20秒(没有.net本机),没有项目引用。同时,一个更大的WPF应用程序(几十个窗口,虽然有几行代码)需要几秒钟,而大部分时间是复制子项目

正如建议的那样,您可以在此处找到一个可供下载的最小示例:


这只是一个带有空白wpf和空白uwp应用程序的解决方案。WPF的编译时间刚刚超过1秒,UWP的编译时间为12秒,在每种情况下,解决方案都被清理,我测试的单个项目被右键单击并重建。这是在调试中(没有.net本机编译)

我完全同意UWP编译比WPF慢得多。每当我到达大约5-6打xaml窗口或视图时,我总是必须分解我的WPF程序集,以便将增量编译时间减少到10-20秒。按照目前的情况来看,我的UWP程序集可能只会增长到大约2或3打的项,而不会花太长时间编译。当您尝试进行迭代编码和调试时,任何编译时间超过10秒的程序集都是有问题的

这里有两条建议,如果你还没有尝试过的话。首先要做的是转到build选项卡,并始终记得取消选中“使用.NET本机工具链编译”。对于正常的调试/测试迭代来说,这是非常无用的

接下来要做的事情是使用procmon监视构建操作。这将暴露任何特定于您的工作站的问题(如病毒扫描、其他可能干扰的应用程序)

以下是我注意到的与WPF相比会减慢UWP编译速度的因素:

  • 大量编译过程(请在“生成输出”窗口中查看):
>MarkupCompilePass1: >XamlPreCompile: >MarkupCompilePass2: >GenerateTargetFrameworkMonitorAttribute: >核心编译: >CopyGeneratedXaml: >CopyFilesToOutputDirectory: >ComputeProcessXamlFiles: >CustomOutputGroupforPackage: >GetPackagingOutputs: >_GenerateProjectPrice配置文件: >_GenerateProjectPriFileCore:
  • 核心/Nuget依赖项

与.NETFramework不同,UWP的所有依赖项都来自.NETCore和nuget。您应该能够使用procmon并查看VS保存这些内容的目录的大量读取:C:\Program Files(x86)\Microsoft SDK\UWPNuGetPackages。请注意,依赖项本身的质量与.Net framework依赖项(在WPF中)没有完全不同。但是,在编译操作期间,这些依赖项的收集方式以及它们在输出目录中的传递方式(最终在最终的Appx目录中)有很大的不同

  • 没有用于优化的“共享输出目录”
使用WPF,我们可以将类库目标单独发送到共享输出目录(通过检查它们的生成,同时取消选中其他库和应用程序exe本身)。然后我们可以启动调试器,而不必编译一大堆不一定会改变的东西。然而,UWP要求我们构建入门级应用程序,而不管我们是否尝试配置共享输出目录

  • UWP中需要新的“部署”步骤
WPF没有在每次构建UWP应用程序时都需要的新“部署”步骤。您将在构建配置中看到该复选框,它适用于入门级应用程序。如果不部署,调试时将看不到所有更改

  • UWP仍在积极变化(与WPF不同)
他们不断更改UWP编译操作。很快,我们将看到一个名为“WinUI”的库,它将从NuGet为UWP应用引入另一个依赖项。在编译性能方面,这可能无助于解决问题

我认为,一旦改变的步伐开始放缓,微软可能会决定专注于寻找提高编译性能的方法。在阅读procmon输出时,似乎很清楚devenv.exe完成的工作中只有不到一半是专门为我完成的。它的其余部分是拉入所有依赖项,以便我的代码可以针对它进行编译。必须有一种方法来优化重复处理。

Ronan空项目的(12秒?)编译时间似乎有点高。。。矿井通常运行不到五秒钟(空时)

您可能希望观察CPU的运行情况。单个项目的编译应该完全受cpu的限制,尤其是在文件系统缓存了源代码(并且下载了所有nuget依赖项)之后的第二次或第三次尝试中。您可能希望密切关注task manager,并确保您在单核上全速运行(即,如果您有四个核,则为25%,八个核为12%,等等)。如果您看到CPU下降太多,则说明出现了问题。另外,请确保检查CPU是否仅由您期望的常规事物使用,例如devenv.exe、VBCSCompiler.exe和MSBuild.exe

对于那些声称编译UWP项目比其他人快得多的人来说,它可能是int > MarkupCompilePass1: > XamlPreCompile: > MarkupCompilePass2: > GenerateTargetFrameworkMonikerAttribute: > CoreCompile: > CopyGeneratedXaml: > CopyFilesToOutputDirectory: > ComputeProcessXamlFiles: > CustomOutputGroupForPackaging: > GetPackagingOutputs: > _GenerateProjectPriConfigurationFiles: > _GenerateProjectPriFileCore:
  100 ms  ValidateAppxManifest                       1 calls
  400 ms  ExpandPriContent                           1 calls
  400 ms  Csc                                        2 calls
  600 ms  ResolveAssemblyReference                   1 calls
 7000 ms  CompileXaml                                2 calls
15063 (creators update) [4 seconds]
16299 (fall creators) [7 seconds]
17134 (version 1803) [ 7.5 seconds]