Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to profile WPF 4.5 UI performance?

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?

like image 975
Alexander Abakumov Avatar asked Nov 01 '15 23:11

Alexander Abakumov


2 Answers

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:

  1. Install the Visual Studio 2015, if you don't have one yet :)
  2. Go to Debug -> Start Diagnostic Tools Without Debugging
    (NOTE: This seems to be changed to Debug -> Profiler -> Performance Profiler...).
  3. Check Application Timeline tool and hit Start in this view:

Tool settings

  1. When your app starts, do the actions causing issues you're interested in.
  2. 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:

Result

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">
like image 135
Alexander Abakumov Avatar answered Nov 02 '22 18:11

Alexander Abakumov


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.

like image 1
Alexandru Avatar answered Nov 02 '22 20:11

Alexandru