++ed by:

4 PAUSE users
3 non-PAUSE users.

Jason Moore


Devel::Timer - Track and report execution time for parts of code


  use Devel::Timer;

  my $t = new Devel::Timer();

  $t->mark("first db query");

  ## do some work

  $t->mark("second db query");

  ## do some more work

  $t->mark("end of second db query");



Devel::Timer allows developers to accurately time how long a specific piece of code takes to execute. This can be helpful in locating the slowest parts of an existing application.

First, the Devel::Timer module is used and instantiated.

  use Devel::Timer;

  my $t = new Devel::Timer();

Second, markers are placed before and after pieces of code that need to be timed. For this example, we are profiling the methods get_user_score() and get_average_user_score().

  $t->mark("first db query");

  $t->mark("second db query");

Finally, at the end of the code that you want to profile, and end marker is place, and a report is generated on stderr.


Sample report:

  Devel::Timer Report -- Total time: 0.3464 secs
  Interval  Time    Percent
  02 -> 03  0.3001  86.63%  second db query -> END
  01 -> 02  0.0461  13.30%  first db query -> second db query
  00 -> 01  0.0002   0.07%  INIT -> first db query

The report is output using the method Devel::Timer::print() which currently just prints to stderr. If you want to send the output to a custom location you can override the print() method. The initialize() and shutdown() methods can also overridden if you want to open and close log files or database connections.


package MyTimer;

use strict; use Devel::Timer; use vars qw(@ISA);

@ISA = ("Devel::Timer");

sub initialize { my $log = "/tmp/timer.log"; open(LOG, ">>$log") or die("Unable to open [$log] for writing."); }

sub print { my($self, $msg) = @_; print LOG $msg . "\n"; }

sub shutdown { close LOG; }

You would then use the new module MyTimer exactly as you would use Devel::Timer.

  use MyTimer;
  my $t = new MyTimer();
  $t->mark("about to do x");
  $t->mark("about to do y");
  $t->mark("done y");




  Jason Moore - jmoore@sober.com