Dr. Dobb's is part of the Informa Tech Division of Informa PLC

This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.


Channels ▼
RSS

Design

Profiling Windows C++ Applications with Microsoft Excel


Oguz Kupusoglu is a software engineer. He can be contacted at [email protected].


Profiling an application is necessary when you want to learn more about how it runs and where its bottlenecks are. A profiler is an analysis tool, which tracks the application while it is being executed. Although the capabilities of the profilers vary, graphically displaying the call cost and hit count--the average time elapsed in milliseconds for a function call, and the number of times a function is called, respectively-- are the most essential features profiling tools should have.

I use Microsoft Visual C++ 6.0 Professional Edition on Windows 2000 and Windows XP. Although this compiler has a profiler, it is a bit cumbersome. Moreover, analyzing the profiler data is not easy. Microsoft has provided the PROFILER.XLM macro to analyze the profiler data. However, I think it is also difficult to use. Consequently, I decided to develop my own simple profiler. The complete source code (and related files) for the profiler is available online.

My primary design goals are:

  • Ease of use. Developers should not need to learn many things on the profiler. It should be as simple as possible. The profiler should be able to profile multithreaded applications.
  • Charts. The call cost and hit count charts should be generated.
  • Averaging. Statistically, it is desirable to collect as much profiler data as possible and then take an average of them.

I decided to develop a class to collect the profiler data and a tool to analyze them graphically with Microsoft Excel (I tested the tool with Microsoft Excel 2000 and Microsoft Excel 2003.) Obviously, I am not after precise measurements; I simply want to compare some numeric data. The CProfiler class is aimed at function level profiling; it doesn't provide any data on line level.

The tool is tightly coupled to Microsoft Excel. However, I developed the CProfiler class with portably in mind; the SData struct is a wrapper for any specific implementation.

CProfiler Class

Listing One shows this class. Note the static functions and data members.

struct SData;
    class CProfiler
    {
        public:
            CProfiler(wchar_t* pId);
            CProfiler(void* pAddress, wchar_t* pType, wchar_t* pOp, wchar_t* pId);
            ~CProfiler();
            bool InitInstance();
            void StopInstance();
            static void InitClass(wchar_t* pDir, bool profiling);
            static void StopClass();
            static void DeleteTemps();
            static void ProcessData();
        private:
            static bool IsDirOK(wchar_t* pDir);
            SData*                       m_start;
            FILE*                        m_file;
            bool                         m_failed;
            wchar_t*                     m_pId;
            static SData*                s_frequency;
            static wchar_t               s_dir[LEN_BUFFER];
            static bool                  s_profiling;
            static bool                  s_failed;
            static bool                  s_stopped;
            static std::map<int,FILE*>   s_files;
            static void*                 s_mutex;
    };

Listing One: CProfiler Class

To simplify the usage, I developed the macros in Listing Two.

#define PROFILER_INITCLASS(dir)                 CProfiler::InitClass(L##dir, true)
#define PROFILER_INITCLASS_CURRDIR              CProfiler::InitClass(0, true)
#define PROFILER_PROCESSDATA                    CProfiler::ProcessData()
#define PROFILER_START(id)                      CProfiler profiler(L##id)
#define PROFILER_STOP                           profiler.StopInstance()

Listing Two: Profiler Macros


Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.