Click here to Skip to main content
15,867,756 members
Articles / Programming Languages / C++

Profiling of C++-Applications in Visual Studio for Free

Rate me:
Please Sign up or sign in to vote.
4.97/5 (48 votes)
11 Jul 2012CPOL4 min read 278.8K   6.5K   162   57
A method for profiling C++-applications with freely available tools (vsperfcmd, vsperfreport, and a C#-application for viewing the results)

Introduction

While the Team- or Premium-editions of Visual Studio contain a profiler, users of e.g. the professional edition are lacking such a feature. In this article, I present a method for profiling C++-applications with freely available tools and a simple application for presenting the results in an informative view.

profileWithVsPerfCmd/Screenshot2.png

Of course, the resulting solution will not be as comfortable as an integrated profiler, but if you use profiling only when you find bottlenecks, this method is certainly sufficient - and €5.000 cheaper.

The following method was tested with Visual Studio 2008 Professional and Visual C++ 2010 Express.

The Method

The method consists of four steps:

  • Generate a special "/PROFILE" build using Visual Studio (all editions can do this).
  • Profile the freshly compiled application with the freely available Microsoft tool "VSPerfCmd".
  • Convert the resulting .vsp-file to .csv-files using "VSPerfReport".
  • Analyze the resulting - huge - csv-files with the attached Profile Result Viewer.

Generate a /PROFILE-build

Note: The following steps should of course be done with a release build and with debugging symbols enabled.

In Visual Studio 2008, go to the solution explorer, select the project and open the properties page. In the section, "Configuration Properties", choose "Linker" - "Advanced".
Set "Profile" to "Enable Profiling information (/PROFILE)" (the exact steps for other versions of Visual Studio might differ).

profileWithVsPerfCmd/screenshot1.png

Compile the project.

Generate a Profile Report (vsp)

First of all, install the Visual Studio Performance Tools. The Visual Studio 2008 Service Pack 1 Stand-Alone Profiler can be found at this link.

The generation of the report requires to enter a handful of commands in the command line.

Preparations in the Commandline

Open the command prompt. Define a shortcut to the performance tools and switch to the folder, your application is located in:

set pt="C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Performance Tools"
cd [my_app_folder]

Profiling a Full Application Run

The simplest method is to profile the full uptime of the application.

:: Start the profiler
%pt%\vsperfcmd /start:sample /output:my_sampled_data.vsp

:: Launch the application via the profiler
%pt%\vsperfcmd /launch:my_app.exe

:: Shut down the profiler (this command waits, until the application is terminated)
%pt%\vsperfcmd /shutdown

Profiling only part of the application Uptime

It is also possible, to profile only part of the application uptime.

Here the handling becomes a bit tedious, so I suppose it would be best to implement some simple app to automize the following steps. Anyways, I never really had the demand for profiling only part of the uptime, since I could (maybe by modifying the application's startup code) always come up with code, that spent 90% of its time in the relevant part. Nevertheless, if you cannot modify your code adequately, here are the additional steps.

Start vsperfcmd as above and attach it to your application afterwards:

:: Start the profiler
%pt%\vsperfcmd /start:sample /output:my_sampled_data.vsp

:: Send the profiler to a waiting state
%pt%\vsperfcmd /globaloff

:: Attach to your application by specifying the pid
%pt%\vsperfcmd /attach:[pid]

After attaching to your application, perform whatever preparation is necessary. Now initiate the function that you want to profile and activate the profiler.

:: Activate the profiler
%pt%\vsperfcmd /globalon 

When the function is finished (or you think enough time has passed), stop profiling:

:: Detach the profiler from your application
%pt%\vsperfcmd /detach

:: Shut down the profiler
%pt%\vsperfcmd /shutdown 

Convert the Profile Report to a csv-file

The tool vsperfreport loads symbol-files (.pdb) and merges them with the generated report (.vsp) to create .csv-Files.

:: generate the report files (.csv)
%pt%\vsperfreport /summary:all my_sampled_data.vsp 

If you are also interested in calls within system files, you can also specify a path to a symbol server or a local cache.

%pt%\vsperfreport /summary:all my_sampled_data.vsp 
/symbolpath:"srv*C:\MySymbolCache*http://msdl.microsoft.com/download/symbols" 

View the Report

The csv-files above can in principle be opened with any spreadsheet application, nonetheless, they are typically huge, and not immediately helpful.

Therefore, I wrote a small application that parses one of the generated files (the one named "...CallerCalleeSummary.csv") and presents it as a tree view, ordered by total percentage. Starting from this view, it should be easy to find the cause for performance problems. For my part, I could uncover several bottlenecks in C++-legacy code, which I would never have found, just by looking at the code.

Using the Code

Attached is also a small C++-application for which I generated a profile. The generated .vsp and .csv-files are contained in the "Release"-subfolder. Opening "my_sampled_data_CallerCalleeSummary.csv" with ProfileResultViewer should resemble the screenshot I have given above.

Points of Interest

  • The profile report will show statistics only for functions, not for individual lines.
  • Functions that are inlined will not be contained in the profile, since they also never appear in the native call stack.
  • The presented treeview is not strictly hierarchic: If A calls B, then in the presented view B might seem to require more time than A. This appears, because total percentages are shown, i.e., it is not shown how much time B took, when it was called from A, but how much time B took in total. I am not sure if the csv-files contain enough information to recover the more detailed figures.

Of course, some of the steps above could be easily integrated into some GUI-Application, but for the moment the procedure I described above is sufficiently simple for me.

History

  • 11.01.2011: Initial version
  • 11.07.2012: Improved speed of ProfileResultViewer for large CSV-files (thanks to SteelixB for giving me the hint)

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Austria Austria
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
SuggestionWorking with huge CSV files Pin
SteelIXB11-Jun-12 1:11
SteelIXB11-Jun-12 1:11 
AnswerRe: Working with huge CSV files Pin
hofingerandi11-Jul-12 2:09
hofingerandi11-Jul-12 2:09 
SuggestionCall tre XSL Pin
Trigve10-Jun-12 23:08
Trigve10-Jun-12 23:08 
GeneralMy vote of 5 Pin
Member 766644014-Mar-12 6:00
Member 766644014-Mar-12 6:00 
QuestionFiltering by pattern in file name using wildcard Pin
Sergey Chepurin8-Feb-12 23:28
Sergey Chepurin8-Feb-12 23:28 
AnswerRe: Filtering by pattern in file name using wildcard Pin
hofingerandi10-Feb-12 8:44
hofingerandi10-Feb-12 8:44 
GeneralRe: Filtering by pattern in file name using wildcard Pin
Sergey Chepurin10-Feb-12 22:12
Sergey Chepurin10-Feb-12 22:12 
QuestionVisual Studio 2010 Performance Tools Pin
Sergey Chepurin6-Feb-12 22:55
Sergey Chepurin6-Feb-12 22:55 
QuestionError processing file: Requested value ' Pin
Dave Calkins4-Nov-11 6:33
Dave Calkins4-Nov-11 6:33 
AnswerRe: Error processing file: Requested value ' Pin
Dave Calkins4-Nov-11 6:37
Dave Calkins4-Nov-11 6:37 
AnswerRe: Error processing file: Requested value ' Pin
hofingerandi4-Nov-11 10:11
hofingerandi4-Nov-11 10:11 
GeneralRe: Error processing file: Requested value ' Pin
Dave Calkins5-Nov-11 2:52
Dave Calkins5-Nov-11 2:52 
GeneralRe: Error processing file: Requested value ' Pin
Dave Calkins7-Nov-11 5:54
Dave Calkins7-Nov-11 5:54 
BugI met the error when doing the step %pt%\vsperfcmd /start:sample /output:my_sampled_data.vsp Pin
Ha Luong9-Oct-11 21:57
Ha Luong9-Oct-11 21:57 
AnswerRe: I met the error when doing the step %pt%\vsperfcmd /start:sample /output:my_sampled_data.vsp Pin
hofingerandi10-Oct-11 1:27
hofingerandi10-Oct-11 1:27 
GeneralGood article Pin
BillW3314-Feb-11 3:10
professionalBillW3314-Feb-11 3:10 
GeneralDownloading now ... Pin
Jerry Evans13-Jan-11 8:23
Jerry Evans13-Jan-11 8:23 
Generalblue screen on Windows 7 64 with Nehalem processor Pin
ferdo13-Jan-11 5:09
ferdo13-Jan-11 5:09 
QuestionHas anyone luck with this on Window7 ? Pin
Jens froslev-nielsen12-Jan-11 20:44
Jens froslev-nielsen12-Jan-11 20:44 
AnswerRe: Has anyone luck with this on Window7 ? Pin
hofingerandi12-Jan-11 21:24
hofingerandi12-Jan-11 21:24 
GeneralRe: Has anyone luck with this on Window7 ? Pin
Jens froslev-nielsen13-Jan-11 7:28
Jens froslev-nielsen13-Jan-11 7:28 
GeneralRe: Has anyone luck with this on Window7 ? Pin
prinzhang30-Jan-13 15:21
prinzhang30-Jan-13 15:21 
QuestionRe: Has anyone luck with this on Window7 ? Pin
hofingerandi30-Jan-13 20:44
hofingerandi30-Jan-13 20:44 
AnswerRe: Has anyone luck with this on Window7 ? Pin
prinzhang8-Feb-13 20:19
prinzhang8-Feb-13 20:19 
AnswerRe: Has anyone luck with this on Window7 ? Pin
prinzhang15-Feb-13 15:57
prinzhang15-Feb-13 15:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.