PHP Measure Execution & Elapsed Time for Functions or Scripts

To measure execution times or duration of a php function or script, use the following:

function start($name) {
    global $stats;

    if (defined('DEBUG') && !DEBUG) {
        return;
    }

    $start = microtime(true);

    if (empty($stats)) {
        $stats['start'] = $start;
        $stats['stop'] = '';
        $stats['duration'] = '';
    }

    $stats[$name]['start'] = $start;
    $stats[$name]['stop'] = '';
    $stats[$name]['duration'] = '';
}

function stop($name='', $return=false, $precision=2) {
    global $stats;

    if (defined('DEBUG') && !DEBUG) {
        return;
    }

    $stop = microtime(true);

    if (!empty($name)) {
        $stats[$name]['stop'] = $stop;
        $stats[$name]['duration'] = round($stats[$name]['stop'] -
                                         $stats[$name]['start'], $precision);
    }
    else {
        $stats['stop'] = $stop;
        $stats['duration'] = round($stats['stop'] -
                                 $stats['start'], $precision);

        // only show duration
        unset($stats['start']);
        unset($stats['stop']);
        foreach ($stats as $key => $value) {
            if (isset($stats[$key]['start'])) {
                $stats[$key] = $stats[$key]['duration'];
            }
        }

        $summary = print_r($stats, true);
        $summary = trim($summary);
        $summary = preg_replace('/^Array\n/', '', $summary);

        if (!($return === false)) {
            return $summary;
        }
        else {
            echo $summary;
        }
    }
}

Example usage:

function some_task() {
    sleep(2);
}

function another_task() {
    for ($i = 0; $i <= 100; $i++) {
        usleep(1000);
    }
}

function yet_another_task() {
    time_sleep_until(time() + 4);
}

// turn on debugging
define('DEBUG', true);

// task 1
start('some task');
some_task();
stop('some task');

// task 2
start('another task');
another_task();
stop('another task');

// task 3
start('yet another task');
yet_another_task();
stop('yet another task');

// summary
stop();

The above code will output something similar to this.

(
    [duration] => 5.16
    [some task] => 2
    [another task] => 0.12
    [yet another task] => 3.04
)

Comments

Leave a Reply