I'm developing a .NET 4.5 WPF app and having UI rendering performance issues.
After some googling, I came across WPF Performance Suite page which describes exactly the tool I need - Visual Profiler. It allows to view WPF elements tree and analyze the contribution of each element to the total rendering time.
The only problem is that the page states that the tool is contained in Microsoft Windows SDK v7.1 which is targeting Windows 7 and .NET 4.0.
Since my app is for .NET 4.5 and I'm on Windows 8.1, I've installed Windows SDK for Windows 8.1. To my surprise, it doesn't seem to contain the WPF Performance Suite at all and that tool in particular.
Then, I've tried to install the WPF Performance Suite from this answer, but it works only with .NET 4.0 apps.
So, where do you get the WPF Performance Suite for .NET 4.5 apps?
Or, to be more general, how do you profile WPF UI rendering performance of .NET 4.5 apps to find out which elements in the tree have highest performance impact in complex UIs?
Eventually, I've found a tool that I was looking for and that was really helpful for me.
To get an idea of where exactly is the bottleneck in rendering your WPF layout, you want to:
- Install the Visual Studio 2015, if you don't have one yet :)
- Go to Debug -> Start Diagnostic Tools Without Debugging
(NOTE: This seems to be changed to Debug -> Profiler -> Performance Profiler...).
- Check Application Timeline tool and hit Start in this view:
- When your app starts, do the actions causing issues you're interested
in.
- Then hit Stop recording and you'll eventually get your elements
tree with times spent for rendering every node.
Then, you only need to sort it by Duration (total) and expand slowest nodes until you find the problem:
In conclusion, it would much easier to correlate the nodes from tree above with your layout if you set names for your controls using the Name
attribute like the following:
<TextBlock Name="OwnerContact">
As it turns out, later versions of Visual Studio have this built in, so right now with Visual Studio 2013, I can create a new profiler session by opening up Visual Studio, and from the top menu there is an Analyze drop down, just go to Analyze -> Profiler -> Attach/Detach to attach it to an existing process running in Debug mode (I seem to have to do this inside of another Visual Studio window or else its grayed out). But, side note: its really bad and not very intuitive...I would recommend using some nicer, commercial profilers instead because they are much simpler.