Boost logo

Boost :

From: Brian Braatz (brianb_at_[hidden])
Date: 2005-02-06 12:16:32


> -----Original Message-----
> From: boost-bounces_at_[hidden]
[mailto:boost-bounces_at_[hidden]]
> On Behalf Of Martin Slater
> Sent: Saturday, February 05, 2005 10:30 PM
> To: boost_at_[hidden]
> Subject: Re: [boost] Profiler Library Proposal
>
> christopher diggins wrote:
>
> > I have posted preliminary documentation and source code for a
proposal
> > for the boost profiler library at http://www.cdiggins.com/profiler/
.
> > The code has been successfully compiled on Visual C++ 7.1 but not
> > tested yet.
> >
> > There have been some updates to the code as a result of the
> > suggestions made so far. Any further comments are appreciated.
>
> Being able to generate a heirarchicle recording / output would be very
> useful (the profiler we use at work does this) so you can drill down
> into code areas that are running slow.
>
> cheers
[Brian Braatz]
Sharing some experiences in relation to where this thread looks like it
may go :)

I am not proposing a library, just sharing with you a library I wrote
and what the results were of building it.

About a year ago, I played around with some similar concepts.

I fundamentally wanted to "see what it would look like" if I could
converge
        * Design By contract,
        * hierarchical logging
        * profiling
                Both by function and by cross cut concepts from a set of
functions AND the operations IN those functions
        * reverse time debugging-
                I.e. you can go back in time and see how the call stack
got you to where the error occurred. In addition to the previous call
stacks that are now "gone".
        * Thread specific data tracking burned into the design

By building the library, I got all of the above working. However many
questions remained for me as to if the syntax required was "too much".
This is still an open question in my mind in that I have not personally
decided either way.

As you will see the "requirements" for a simple function are quite
verbose.

What I built:
        Simple syntax for both profiling and for logging of the
"context" of a concept.
        Ability to grab the callstack of "where" an error occurred and
what the code was doing when it hit an error.
        Ability to put the local variables and the parameters into a
call stack
        Ability to plug in profiling in such a way as to view a
cross\cut of the performance of a set of operations
        Also time profiling was done on EVERYTHING- so with a fancy XSLT
modifer, you can cross cut and get whatever kind of "executive level
analysis" you want on the sheer volumne of data you have
        Basically, to the application coders, what this looks like is an
"Eiffel" style programming model in C++, with the behind the scenes
advantage of
        Profiling
        Call stack tracing
        Heirarchcal logging-
                With context concepts embedded in the log so you can go
back later and look at a "slice" of the performance of something. I even
built a debugger that let me look at the xml files and do this.
        

App Code Requirements:
        The application code must do the following:
                Have a Root object
                Get a context object from root
                Pass the context object into each function with the name
ctx
                        This is for both thread reasons and the
                Use a Eiffel style syntax in the functions

What this looks like in app code (sample code below actually works)

void MyFunction3(Context ctx,int i,Object *p)

{
        Function ( MyClass, MyFunction3, "Function Used for
rotation" );
        Parameters
                        Param (i,"Integer for how many times to loop"
);
                        Param (p,"Object to do something with"
);
                 
        Locals
                        int w = 0; Local(w,"Value for the
weather");
                        int x = 0; Local(x,"Drag
Coefficient");
        Pre

        Execute
                comments << "Func3 is reobooting windows 95" << endl;
                
                ctx.SetError(std::string("DATABASE IS MISSING"),FLUID);
        Post
                
EndFunc
}

void MyFunction2(Context ctx,int i,Object *p)

{
        Function ( MyClass, MyFunction2,
                                "Function Used for calculation" );
        Parameters
                                Param (i,"Integer for how many times
to loop" );
                                Param (p,"Object to do something with"
);
        Locals
                int w = 0; Local(w,"Value for the
weather");
                int x = 0; Local(x,"Drag Coefficient");

        Pre

        Execute
                comments << "Searching for weapons of mass destruction"
<< endl;

                MyFunction3(ctx,i,p);
        Post

        EndFunc
}
void MyFunction1(Context ctx,int i,Object *p)

{
        Function ( MyClass, MyFunction1,
                                "some other Function Used for
calculation" );
        Parameters
                                Param(i,"Integer for counting") ;
                                Param(p,"Object to destroy"
);
        Locals
                int w = 0; Local(w, "Value for the
weather");
                int x = 0; Local(x, "Drag
Coefficient");
                Operation (opAddToVector, "Add passed
string ");
                Operation (opFindAllElements, "Find all
elements ");
        Pre
                ctx.Check( i == 1,"i Must be greater than one ",FLUID);
                ctx.Check( Valid(p) || IsNull(p) ,
                                "p must be a valid object or null",
FLUID);
        Execute
                { Scope (opAddToVector);
                        comments << "Adding to vector" << endl;
                        {
                                Scope (opFindAllElements);
                                Comments << "Finding all elements" <<
endl;
                                MyFunction2(ctx,i,p);
                        }
                }
                
        Post
        
        EndFunc
                
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk