tags:

views:

88

answers:

5

What is the best way to see how long it takes for your PHP script to run?

I was thinking something like this:

$start_time = time(); //this at the beginning
$end_time = time(); //this at the end
echo = $end_time-$start_time;

What do you all think? But how can I make it into something that is readable to me and make sense to me?

+3  A: 

I would use microtime(TRUE) instead. That'll give you better results with microsecond resolution. There's also the PECL APD extension which profiles scripts.

Expanding a bit on APD, assuming one has APD installed, you just need to add the line

apd_set_pprof_trace();

to the top (or whenever you want to start tracing) of your script. It generates a profiling file with pprofp which generates very readable output

Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace

The example output is from the PHP manual.

I personally find APD extremely useful and use it quite frequently in heavily-hit scripts.

Xorlev
+1 for PECL APD! Great answer!
Mark Tomlin
[Example usage][1] of [apd_set_pprof_trace()][2] seems to give the most correct answer for this question. [1]: http://php.net/manual/en/apd.examples.usage.php [2]: http://us.php.net/manual/en/apd.examples.usage.php
Mark Tomlin
This is awesome. Thanks!
Adam Evers
+4  A: 

If you want any further granularity to your timing than seconds, you'll need to use microtime() (Return current Unix timestamp with microseconds)

<?php
$time_start = microtime(true);

// Sleep for a while
usleep(100);

$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did nothing in $time seconds\n";
?>

** Below was added later **

As far as formatting this result further:

Well, depending on what you're doing, you typically don't have scripts going past a minute. You definitely shouldn't have anything exceeding an hour. (If you do, you need to ask yourself what you are doing with your life)

With that in mind, all you need is simple calculations:

$tmp = floor($time);
$minutes = $tmp / 60;
$seconds = ($tmp % 60) + ($time - $tmp);

$output = 'Script took ';
if ($minutes > 0)   $output .= $minutes . ' minutes and ';
$output .= $seconds . ' seconds to complete.';
echo $output;

(This isn't tested, and it could potentially be optimized, but should start you in the right direction)

Dominic Barnes
Suggestions on how to make this human readable? AKA I would love for it to say something like it took 1 minute 34 seconds and 54 microsecons etc something like that. Don't even know what/how we I should be storing it ...
Adam Evers
@Adam, check out my additions to my answer
Dominic Barnes
+1  A: 

Is this a web-accessible script (i.e. http://www.yoursite.com/BLA.php), or a script that you're running through the command line? If it's a command line script, you can use the time command:

time php FILE.php

Otherwise, microtime is probably your best bet.

Jason B
+1  A: 

I find this class to be useful to time the scripts, microtime turn out to be friend in that:

 class timer
 {
  private $start_time = NULL;
  private $end_time = NULL;

  private function getmicrotime()
  {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
  }

  function start()
  {
    $this->start_time = $this->getmicrotime();
  }

  function stop()
  {
    $this->end_time = $this->getmicrotime();
  }

  function result()
  {
   if (is_null($this->start_time))
   {
    exit('Timer: start method not called !');
    return false;
   }
   else if (is_null($this->end_time))
   {
    exit('Timer: stop method not called !');
    return false;
   }

   return round(($this->end_time - $this->start_time), 4);
  }

  # an alias of result function
  function time()
  {
   $this->result();
  }

 }
Sarfraz
+1  A: 

Knowing how long something takes to run is one thing, finding out where (in your php operations) it slows down and why is another question.

If you're serious about find an answer to the latter question then install xdebug, and you get the bonus of not having to call the likes of microtime() which itself slows down your script.

http://xdebug.org/docs/profiler

http://xdebug.org/docs/

Cups
Nice I will have to look into this ... thanks!
Adam Evers