There was another discussion about XAML performance (runtime performance of xaml rendering). I didn't want to hijack that completely ... so I am opening this separate discussion about xaml compiler performance.
Here is the starting point for the discussion. @jtorjo said :
uwp compilation times are insanely slow! (pretty much, 6 times slower that WPF - i'm using target version build 1809 - build 17783)
I definitely agree. Debug/run iterations (development "inner loop") is quite slow compared with wpf or winforms, or most other U/I technologies. This productivity hurdle seems to be primarily related to the compilation of uwp-xaml. The performance of compiling uwp-xaml took a big turn for the worse after the "fall creator's update". There are many reports of performance troubles in the VS community including my own:
https://developercommunity.visualstudio.com/content/problem/376045/compilation-of-uwp-xaml-project-is-slower-when-tar.html
Not to be overly critical, but I really don't think Microsoft has started looking deeply at developer productivity of UWP on the .net side of things. Or at least they aren't directly tackling the compilation side of the problem. They have invested in other approaches for improved productivity like xaml edit-and-continue, and "xaml studio", etc. While these are helpful, they seem like workarounds and it seems like a lot more can be done.
After one of my community posts about performance, the developer tools team had made a statement, although I cannot find it anymore (maybe censored?) . The team had added the following statement to my developercommunity post. The statement tries to explain the regression after the fall creator's update: "This performance issue you that identified was introduced in an effort to address build consistency issues, especially in incremental compiler situations. With that in mind, we are looking at ways to make this better so the compile time impact is less."
Here are some of the community posts on the topic of UWP compile performance (there are many):
My understanding is that redundant iterations of the "CompileXaml" tasks are being executed by Visual Studio (ie. even more compilation passes than reasonable)
I think the most constructive thing we can do is to provide hard measurements (from the VS output window) to corroborate our anecdotal observations that the compilation of uwp-xaml projects is slow. There may not be enough feedback, nor metrics from C#/desktop developers yet. (I suspect there are not enough of us to begin with. I suspect that much of the developer base for UWP/WINUI is still C++).
Capturing hard measurements is critical. I'd recommend tuning your workstation and then compiling the "vanarsdel" sample project on github. There are two of them - a regular vanarsdel and a vanarsdel "inventory sample". You can compare to my results on stack overflow, and then post your own results as well: https://stackoverflow.com/questions/52919086/speeding-up-compilation-in-uwp
I also want to point out that I had asked the question about xaml compile performance in the first winui community call : https://github.com/microsoft/microsoft-ui-xaml/issues/1478 ...
See the end of the video at 46:30. Someone named "Daniel" (Jacobson I believe) said they were going to try to improve performance for the "next version" of uwp/winui (see 47:30).
For the Alpha we released today we focused on bringing existing functionality up as soon as possible to get everybody's feedback. This release did not yet include the performance fixes we talked about before in a developer community thread (linked above). Now that the Alpha is out there, I want to assure everybody that those improvements are still pretty much plan of record for WinUI 3.0 and we are all committed to addressing them in this release. BTW, that Daniel on the call was me (not Jacobson).
@dbeavon I've compiled VanArsdel, on 17763 build. Note that at this time, I can't change the min version, since I get a compile error.
Build vanarsdel ,debug x64, build 17763
1>Project Performance Summary:
1> 12521 ms C:\john\code\buff__photawe\VanArsdel-master\VanArsdel\VanArsdel.csproj 1 calls
1> 12521 ms Build;BuiltProjectOutputGroup;BuiltProjectOutputGroupDependencies;DebugSymbolsProjectOutputGroup;DebugSymbolsProjectOutputGroupDependencies;DocumentationProjectOutputGroup;DocumentationProjectOutputGroupDependencies;SatelliteDllsProjectOutputGroup;SatelliteDllsProjectOutputGroupDependencies;SGenFilesOutputGroup;SGenFilesOutputGroupDependencies 1 calls
1>Task Performance Summary:
...
1> 0 ms Delete 2 calls
1> 114 ms Copy 5 calls
1> 134 ms WireUpCoreRuntime 1 calls
1> 263 ms GenerateResource 1 calls
1> 270 ms ResourceHandlingTask 1 calls
1> 316 ms ValidateAppxManifest 1 calls
1> 420 ms ResolveAssemblyReference 1 calls
1> 463 ms GenerateProjectPriFile 1 calls
1> 651 ms GenerateAppxManifest 1 calls
1> 684 ms GenerateAppxPackageRecipe 1 calls
1> 810 ms Csc 2 calls
1> 7380 ms CompileXaml 2 calls
@danzil This is amazing news! Any ETA when this may be addressed?
P.S. I can't target anything lower than 17763 in my app, because of my dependencies.
@jtorjo We plan to address this with WinUI 3.0 in 2020, which is planned to be able to target down-level to that SDK (roadmap).
@jtorjo looks similar to my results. There are two variations of this perf summary. One for the first compilation of a project and one that you see after making incremental changes to code/xaml. Both variations are about the same where "compilexaml" task is concerned.
The most discouraging thing that I had noticed is when I add the very first xaml control to a Uwp project and the compile time jumps up by 2 or 3 additional seconds (regardless the size or complexity of xaml). After only 1 or 2 dozen xamls , the project takes over 10 secs to compile and that is where I totally lose patience....
However I've heard die-hard developers say they wait 30 seconds or longer for their uwp-xaml to compile (per project). I don't know how you get anything accomplished at that point... I'd love to see the vs telemetry that identifies the devs who are the most "patient" . Uwp.net devs have to be up near the top of the list. ;-)
@dbeavon I totally feel you! That's what's killing me as well... I know I've seen somewhere on the internet (maybe it was you who said it) breaking up the UI into several assemblies.
I may end up doing just that...
As I've said in some other posts, I really need UWP, since I have to use win2d - so no matter how I slice and dice it, I still need to put up with those times.
@danzil That sounds really cool, I'm definitely looking forward to that! In the mean time, is there anything we can do to speed compilation times? I'm willing to create a RAM disk and install my SDK there on each reboot, assuming that would make a difference (@dbeavon have you tried that?)
Unfortunately, I don't know of any workarounds besides just installing the latest VS that has fixed a couple of regressions in that area a few months ago.
The ramdisk wouldn't perform much better than ssd. The bottleneck during builds is single-threaded CPU for a given project. (Although multiple projects might build in parallel if they are independent of each other.) I would invest in > 4 GHz CPU if possible and make sure none of that is being wasted on defender or telemetry/insights or whatever. There are several things you can do in your debug settings to improve the F5 launch a bit.
The best trick is to divide the code into smallish projects which compile in under 10 sec. If you have experience with WPF then you may know the trick to use a shared output directory and avoid compiling the startup project when it isn't actually changing. That trick is possible in Uwp as well but was touchy and took some effort. The end goal is to avoid waiting more than about 10 sec for F5. How long are you waiting?
@dbeavon I see... Yeah - I disabled Windows defender years ago. No telemetry either.
Dividing the code into smallish projects will probably be my best bet.
About the shared output directory: Is this what you're referring to: https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/using-a-common-intermediate-and-output-directory-for-your-solution/ ?
I wasn't aware of it, since i never needed it. My WPF projects have always been fast to compile - a fresh compile of 28 WPF projects usually takes less than 15 seconds. So whenever I change something, it will probably be around 5s or less until the app starts.
On UWP, I have a project where all the UI is (xaml), and that takes around 15-20 seconds or so to compile. And another 6-7 seconds to deploy (sometimes a bit faster)
@jtorjo For instructions on setting a common output directory, see this:
https://docs.microsoft.com/en-us/visualstudio/ide/how-to-build-to-a-common-output-directory?view=vs-2019
I would create new/separate project configurations that are copied from your Debug ones. Call them DebugFromCommon or something and set the common output directory where you want all the outputs to go. Then create a DebugFromCommon solution configuration as the parent for these new project configs. Then rebuild the whole solution under the DebugFromCommon config. Then edit the solution configuration to uncheck "compile" for any of the projects you aren't actively working on (including the launch project).
After this is finished, your F5 will never compile projects that are not checked... even if some of the dependencies have been modified. The projects which are getting compiled will be dropped into the common output directory and will be ready for execution. Just remember to do a "fresh" rebuild of the entire solution to the common output directory once a day, and whenever you run into any unexpected issues like loader exceptions. Hope this is clear.
@dbeavon Sorry for the late reply - it's been hectic for me lately.
I followed your instructions.
The big "lightbulb" for me has been the check/uncheck of projects to build. I knew about this setting for years, but never truly needed it. But now that I think of it, I managed to uncheck 9 projects - so I'm only compiling 5. This, together with the deployment, boils down to 10-12 seconds until my app is up and running.
This is down from roughly 40-50 seconds, so it's a huuuge improvement. Thanks for the help!
@danzil About your post on #1517 : That's great! Is there any ETA when we'll have something?
As an FYI, the more recent of a Windows version you're targeting, the worse the compile time.
Right now, I'm targeting 1903, and just the deployment itself takes 6+ seconds! (no building at all). On 1809, deploment was less than 1 second.
Anything you can give us would be great - I don't mind creating a RAMDisk, whatever, just to speed up compilation times.
@jtorjo please add your voice to #1517, especially the numbers you've just listed. That helps us back the investment we're adding behind that effort. I wish I could give you a definitive ETA, but I can't. All I can say at the moment is that we've identified a substantial amount of design improvements we want to make and they're all queued up in our internal work item tracking system.
@danzil Done, thanks!
Looks like #2171 contains similar or identical feedback, but let's use this issue to track all WinUI Xaml compile performance issues. I'll turn this into a bug (we already have another internal deliverable tracking this work).
Yes, the compile of xaml is take huge time... I have project without UI - no problem with compile performance, but XAML/UWP/C++ very long compilation.
I'd like to mention this issue here: https://developercommunity.visualstudio.com/content/problem/970383/uwp-app-build-takes-an-hour-and-vs2019-is-throwing.html?childToView=1043331#comment-1043331 Apparently, there is a huge performance degradation in VS2019 16.4+ and in our case it is causing 10 minutes delay between hitting "Run" and starting the application - with no code changes, just an incremental build of the EXE in Debug + deploy + run. Modifying Microsoft.AppxPackage.Targets as described in the solution helps, but the question is whether the issue is going to be fixed by some VS update (and which parts of XamlIslands and WinUI 3 are going to be broken by removal of the build steps in the targets file).
@jimm98y Reading the issue almost makes me cry. I feel ya! Apparently, my compile times are nothing compared to what you have, but it still drives me insane!
At MS Build, Microsoft said they will be working on compile times, but they need to also deal with winui 3. I really hope they'll do it really soon, since there will be quite a few iterations of winui 3 (as I understand, iteration 4 will be end of year) -- so are we supposed to wait another year until winui 3 becomes stable?
I've just tested WinUi 3.0 preview(using Win32 desktop project). The compile time is still huge, even for a minimal project. It seems it's not UWP's problem. I believe the problem is with WinuI's developing language, i.e. c++. Really missing WPF now. Hope there will be a c# version of Winui in the future. What a pity!
Any update on this issue
Thanks everyone for your patience.
We are aware of the build performance issues. At this time, our team is focused 100% on bringing back WinUI tooling support in Visual Studio (primarily Live Visual Tree, Hot Reload). Once we complete that work, we should be able to look more into build pipeline performance improvements.
With that being said, @Scottj1s is getting starting to investigate pipeline performance, the goal being to find and rid off any low hanging fruit issues. He will be sharing out data once he has it.
Thanks everyone for your patience.
We are aware of the build performance issues. At this time, our team is focused 100% on bringing back WinUI tooling support in Visual Studio (primarily Live Visual Tree, Hot Reload). Once we complete that work, we should be able to look more into build pipeline performance improvements.
With that being said, @Scottj1s is getting starting to investigate pipeline performance, the goal being to find and rid off any low hanging fruit issues. He will be sharing out data once he has it.
Wow, this couldn't have come at a better time!
Having said that, if anyone's interested, I could write another post detailing what I've found.
Most helpful comment
@jtorjo We plan to address this with WinUI 3.0 in 2020, which is planned to be able to target down-level to that SDK (roadmap).