views:

534

answers:

5

I've used a few profilers in the past and never found them particularly easy. Maybe I picked bad ones, maybe I didn't really know what I was expecting! But I'd like to know if there are any 'standard' profilers which simply drop in and work? I don't believe I need massively fine-detailed reports, just to pick up major black-spots. Ease of use is more important to me at this point.

It's VC++ 2008 we're using (I run standard edition personally). I don't suppose there are any tools in the IDE for this, I can't see any from looking at the main menus?

+4  A: 

VS built in:

If you have team edition you can use the Visual Studio profiler.


Other options:

Otherwise check this thread.


Creating your own easily:

I personally use an internally built one based on the Win32 API QueryPerformanceCounter. You can make something nice and easy to use within a hundred lines of code or less.

The process is simple: create a macro at the top of each function that you want to profile called PROFILE_FUNC() and that will add to internally managed stats. Then have another macro called PROFILE_DUMP() which will dump the outputs to a text document.

PROFILE_FUNC() creates an object that will use RAII to log the amount of time until the object is destroyed. Both the constructor of this RAII object and the destructor will call QueryPerformanceCounter. You could also leave these lines in your code and control the behavior via a #define PROFILING_ON

Brian R. Bondy
Trying Sleepy, not entirely sure about it yet.
John
I've hated how Microsoft took a great tool (Visual Studio Professional) and priced great features like the profiler completely out of my reach. So instead of getting a guaranteed $600 from me, I'm just going to use mingw and use trial and error.
Chris Kaminski
+1  A: 

I used lt prof in the past for a quick run down of my C++ app. It works pretty easy and runs with a compiled program, does not need and source code hooks or tweaks. There is a trial version available I believe.

Charles
++ I just followed that link, and it looks promising. It clearly works by stack sampling and gives line-level resolution. I can't tell if it allows samples during I/O or other blocking, which would allow detecting needless I/O.
Mike Dunlavey
I just tried out LTProf. What I like is that it gives line-level percent, and it does sample during I/O (Yay!!). Then I was sad to see that there was no way to manually turn the sampling on/off, like with a hot key. Thus, if a program is interactive, there is no way to say "sample NOW", not when it's waiting for user input.
Mike Dunlavey
+5  A: 

I suggest a very simple method (which I learned from reading Mike Dunlavey's posts on SO):

Just pause the program.

Do it several times to get a reasonable sample. If a particular function is taking half of your program's execution time, the odds are that you will catch it in the act very quickly.

If you improve that function's performance by 50%, then you've just improved overall execution time by 25%. And if you discover that it's not even needed at all (I have found several such cases in the short time I've been using this method), you've just cut the execution time in half.

I must confess that at first I was quite skeptical of the efficacy of this approach, but after trying it for a couple of weeks, I'm hooked.

Michael Myers
++ Yeah, I'm afraid I've made a royal pest of myself advertising that technique, but darn it, it works. (The important thing is to look at the call stack. Sometimes people say "It's in some system routine - what good is that?" when the problem is obvious a few levels up.)
Mike Dunlavey
+1  A: 

I always used AMD CodeAnalyst, I find it quite easy to use and gives interesting results. I always used the time based profile, in which I found that it cooperates well with my apps' debug information, letting me find where the time is spent at procedure, C++ instruction and single assembly instruction level.

Matteo Italia
+1  A: 

A very simple (and free) way to profile is to install the Windows debuggers (cdb/windbg), set a bp on the place of interest, and issue the wt command ("Trace and Watch Data"). Check out MSDN for more info.

nithins
++ I used windbg ages ago, and relied on the Ctrl-C method. Then if I wanted it to run slowly I would use a Watch Data, as you recommend.
Mike Dunlavey