i'm just tossing this idea out...

1) have a profiler package that handles all the logging, etc - and uses a constant

        package MyApp:::Profiler;
        use constant DO_PROFILE=> 1;
        sub profile {
                my ( $marker )= @_ ;
                #log;
        }
        1;

2) in your app code, do this:
MyApp:::Profiler::DO_PROFILE && MyApp:::Profiler::profile( 'some identifier' );

My rationale:
a) creating the namespace / etc means you can just wrap whatever method you want cleanly b) mp will optimize away the calls to profile if you start the server with DO_PROFILE set to 0 -- this way you don't have to deal with a performance hit in production and can leave the calls intact as-is.

in terms of actually recording...

i'd probably stack everything into a local variable as an array ; then id drop in a cleanup handler that calls a function to write it to disk or memory somehow... you'd have to have a reset within the package that clears out the var too

        my      @profile;
        sub profile {
                my ( $marker )= @_ ;
                push @profile , $marker;
        }
        sub cleanup {
                # record
                        record( [EMAIL PROTECTED] );
                # reset
                @profile= ();
        }

in any event , the bulk of my suggestions are this:
1- there's no reason to continually write to disk or shared mem , or call misc functions ( unless you're profiling in-time ). just store that stuff in a perl structure and dump 1x. 2- use the optimize-away hack with constants to quickly turn off your debug code



On Nov 12, 2007, at 10:42 AM, E R wrote:

Hi,

I have the need for a simple profiling capability for mod_perl applications.
At a few (< 50) points in my code I want to call something like:

$profiler->mark("some identifier");

and increment the counter for "some identifier". Later I want to be able to get
(through a web page) a summary (grouped by identifiers) of all the
profiling calls
made (of course, made by all Apache child processes.) For instance, if I want to profile the number of times a particular subroutine was called, I would use:

sub mysubroutine {
  $profiler->mark("in mysubroutine");
  ...
}

This is very similar to logging, except for the summary part. Does anyone
have ideas of a good way to implement this? Shared memory? An external
daemon to record these calls? Has someone already implemented this?
Robust and simple are good.

Thanks,

ER

Reply via email to