测量PHP中代码段之间的经过时间

时间:2012-06-27 21:57:35

标签: php time

我希望能够测量两段代码之间的经过时间。这仅仅是为了能够检测代码中的瓶颈并改进可以改进的内容。

我想设计一个函数,其中函数应该使用全局变量,该变量回显当前调用和上次调用之间经过的时间。

这样,你可以一个接一个地使用它。

该功能应该能够计算分数秒的差异,例如0.1秒或0.3秒等。

一个例子可能会更好地解释它。

echo time_elapsed();   

     // This echo outputs nothing cause this is the starting case. 
     // There is nothing to compare against. 

//
// 1st code section here
//

echo time_elapsed();  

      // This echo outputs 0.5 seconds. 
      // ...which means there has been 0.5 seconds passed 
      // ...since the last time time_elapsed() was fired

//
// 2nd code section here
//


echo time_elapsed()   

      // This echo outputs 0.2 seconds

//
// 3rd code section here 
//

echo time_elapsed()   

      // This echo outputs 0.1 seconds etc

我的问题是我需要使用哪些PHP实用程序(内置函数)来实现这种输出?

7 个答案:

答案 0 :(得分:22)

像XDebug / Zend Debugger这样的调试器可以为您提供这种类型的洞察力(以及更多),但这里提示您如何编写这样的函数:

function time_elapsed()
{
    static $last = null;

    $now = microtime(true);

    if ($last != null) {
        echo '<!-- ' . ($now - $last) . ' -->';
    }

    $last = $now;
}

主要是函数microtime()是您进行时间计算所需的全部内容。为了避免全局变量,我在经过的函数中使用了一个静态变量。或者,您可以创建一个简单的类,它可以封装所需的变量,并调用类方法来跟踪和输出时间值。

答案 1 :(得分:13)

来自php doc s 的第一个示例:

<?php
/**
 * Simple function to replicate PHP 5 behaviour
 */
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

$time_start = microtime_float();

// Sleep for a while
usleep(100);

$time_end = microtime_float();
$time = $time_end - $time_start;

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

答案 2 :(得分:4)

这些方面应该有效:

$start = microtime(true); 

// Do something
sleep(2);

$end = (microtime(true) - $start);
echo "elapsed time: $end";

答案 3 :(得分:2)

其他因素会影响脚本的时间安排。例如:

  1. 复杂的代码和递归函数。
  2. 正在使用的Web服务器类型,例如:共享VS专用主机。

答案 4 :(得分:2)

相同的drew010功能(谢谢!),只在微秒(我们)中添加了自定义注释和时间显示:

    function time_elapsed($comment) 
        {

        static $time_elapsed_last = null;
        static $time_elapsed_start = null;

        // $unit="s"; $scale=1000000; // output in seconds
        // $unit="ms"; $scale=1000; // output in milliseconds
        $unit="μs"; $scale=1; // output in microseconds

        $now = microtime(true);

        if ($time_elapsed_last != null) {
            echo "\n";
            echo '<!-- ';
            echo "$comment: Time elapsed: ";
            echo round(($now - $time_elapsed_last)*1000000)/$scale;
            echo " $unit, total time: ";
            echo round(($now - $time_elapsed_start)*1000000)/$scale;
            echo " $unit -->";
            echo "\n";
        } else {
            $time_elapsed_start=$now;
        }

        $time_elapsed_last = $now;
    }               

示例:

// Start timer
time_elapsed('');

// Do something
usleep(100);
time_elapsed('Now awake, sleep again');

// Do something
usleep(100);
time_elapsed('Game over');

输出继电器:

<!-- Now awake, sleep again: Time elapsed: 100 us, total time: 100 us -->
<!-- Game over: Time elapsed: 100 us, total time: 200 us -->

答案 5 :(得分:1)

<?php
$time_start = microtime(true);

// Sleep for a while (or your code which you want to measure)
usleep(100);

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

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

来源:http://php.net/manual/en/function.microtime.php#example-2568

答案 6 :(得分:0)

这个小而强大的课程涵盖了我在开发中的分析需求:

<?php

class perflog {
    protected $perflog = [];

    public function start($tag) {
        if (!isset($this->perflog[$tag])) $this->perflog[$tag] = 0;
        $this->perflog[$tag] -= microtime(TRUE);
    }

    public function stop($tag) {
        $this->perflog[$tag] += microtime(TRUE);
    }

    public function results() {
        return $this->perflog;
    }
}

See it in action here.

它旨在通过后续的start(<tag>)stop(<tag>)来电调用。它生成一个数组,其中包含代码在start()和stop()调用所包含的部分中使用匹配标记的总时间。

起止序列可以嵌套,可以多次输入,从而总结在封闭部分花费的时间。

其紧凑性确保最小的性能影响。动态标签创建可用于让程序修改它监控的内容。通常,这会通过输出或存储功能进行扩展。