测量php脚本执行时间的准确方法


269

我想知道一个PHP for循环执行需要多少毫秒。

我知道通用算法的结构,但不知道如何在PHP中实现它:

Begin
init1 = timer(); // where timer() is the amount of milliseconds from midnight
the loop begin
some code
the loop end
total = timer() - init1;
End

如果在生产中需要使用microtime()语句,则可以摆弄它们,但是如果只是为了测试,则只需使用xdebug的探查器即可。没有凌乱的代码是真正的优点。
2011年

Answers:


524

您可以使用此microtime功能。从文档中

microtime —返回当前的Unix时间戳(以微秒为单位)


如果get_as_float将设置为TRUE,则microtime()返回一个浮点数,它表示自Unix时期精确到最接近的微秒的当前时间(以秒为单位)。

用法示例:

$start = microtime(true);
while (...) {

}
$time_elapsed_secs = microtime(true) - $start;

36
microtime(true)如果要使用返回值进行计算,则需要。
lonesomeday

7
我知道这太迟了(将近4年),但是作为注释... 根据PHP文档,使用这些计算(参数get_as_floattrue)将以秒为单位提供结果。
亚历杭德罗·伊万

6
@patrick,这就是我说的:如果get_as_floattrue,则microtime()返回代表秒数的值...
AlejandroIván2015年

2
虽然这是一个很老的文章中,我们应该指的是事实,即浮动返回确实包含了微秒...最好的解决方案是本次由1000 ...看到stackoverflow.com/questions/3656713/...作为一个例子。 。
愤怒84

1
这个答案已经过时了。如今,报告脚本执行时间的最佳方法是在代码末尾添加一行:($time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; 更多信息请参见下面的答案。)
ashleedawg

84

您可以microtime(true)通过以下方式使用:

将其放在您的php文件的开头:

//place this before any script you want to calculate time
$time_start = microtime(true);

//您的脚本代码在这里

// do something

把它放在你的php文件的末尾:

// Display Script End time
$time_end = microtime(true);

//dividing with 60 will give the execution time in minutes other wise seconds
$execution_time = ($time_end - $time_start)/60;

//execution time of the script
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins';

它将输出结果minutes


72

您可以REQUEST_TIME$_SERVER超全局数组使用。从文档中

REQUEST_TIME
请求开始的时间戳。(自PHP 5.1.0起可用。)

REQUEST_TIME_FLOAT
请求开始的时间戳,以微秒为单位。(自PHP 5.4.0起可用。)

这样,您无需在脚本开始时保存时间戳。您可以简单地执行以下操作:

<?php
// Do stuff
usleep(mt_rand(100, 10000));

// At the end of your script
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];

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

在这里,$time将包含自脚本开始以来经过的时间(以秒为单位),精度1.341为微秒(例如1秒和341微秒)


更多信息:

PHP文档$_SERVER变量microtime函数


这很容易知道。因此,您可以使用:$start = $_SERVER["REQUEST_TIME_FLOAT"]; $myscript = microtime(true); $bootstrap = $myscript - $start; ...do stuff ...; $myscripttime = microtime(true) - $myscript;
pspahn

1
关于使用此方法的全部要点是,您可以执行以下操作:$myscripttime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];在脚本的末尾,而不必在开始时保存时间戳。
Iwazaru 2015年

1
根据链接的文档,$time将包含以单位的差异,而不是以微秒为单位
Wim Deblauwe

4
@WimDeblauwe要澄清,是的,结果以秒为单位。但是具有微秒级的精度。例如 1.1等于1秒+ 100微秒。
克里斯·哈里森

1
这是确定响应时间的最佳方法
Mike Aron

27

创建文件loadtime.php

<?php
class loadTime{
    private $time_start     =   0;
    private $time_end       =   0;
    private $time           =   0;
    public function __construct(){
        $this->time_start= microtime(true);
    }
    public function __destruct(){
        $this->time_end = microtime(true);
        $this->time = $this->time_end - $this->time_start;
        echo "Loaded in $this->time seconds\n";
    }
}

<?php写完之后比脚本的开头include 'loadtime.php'; $loadtime=new loadTime();

当页面最后加载时,将写为“ Loaded in x seconds”


5
整齐!但是,如果您未明确销毁对象,则输出将显示在</html>无效的结束标记之后
Dmitry Pashkevich 2013年

@gondo不,它将是秒(微秒表示为秒的十进制值)
FrancescoMM



7

这是一个计时任何PHP代码的时间的函数,就像Python的timeit模块那样: https //gist.github.com/flaviovs/35aab0e85852e548a60a

如何使用它:

include('timeit.php');
const SOME_CODE = '
        strlen("foo bar");
';
$t = timeit(SOME_CODE);
print "$t[0] loops; $t[2] per loop\n";

结果:

$ php x.php 
100000 loops; 18.08us per loop

免责声明:我是本摘要的作者

编辑:timeit现在是一个单独的,自包含的项目,位于https://github.com/flaviovs/timeit


5

您有一个正确的想法,除了可以使用microtime()获得更精确的计时函数。

如果循环内部的速度很快,则表观的经过时间可能为零。如果是这样,请在代码周围包裹另一个循环并重复调用它。确保将差值除以迭代次数以得到一次。我分析了代码,该代码需要10,000,000次迭代才能获得一致,可靠的时序结果。


3

我以为我会分享自己的功能。希望它可以节省您的时间。

它最初用于跟踪基于文本的脚本的计时,因此输出为文本形式。但是,如果愿意,您可以轻松地将其修改为HTML。

自脚本开始以来以及在每个步骤中,它将为您执行所有计算,花费了多少时间。它格式化所有输出的精度为3位小数。(低至毫秒。)

将其复制到脚本顶部后,您要做的就是在每个要计时的片段之后放置recordTime函数调用。

将此复制到脚本文件的顶部:

$tRecordStart = microtime(true);
header("Content-Type: text/plain");
recordTime("Start");

function recordTime ($sName) {
  global $tRecordStart;
  static $tStartQ;
  $tS = microtime(true);
  $tElapsedSecs = $tS - $tRecordStart;
  $tElapsedSecsQ = $tS - $tStartQ;
  $sElapsedSecs = str_pad(number_format($tElapsedSecs, 3), 10, " ", STR_PAD_LEFT);
  $sElapsedSecsQ = number_format($tElapsedSecsQ, 3);
  echo "//".$sElapsedSecs." - ".$sName;
  if (!empty($tStartQ)) echo " In ".$sElapsedSecsQ."s";
  echo "\n";
  $tStartQ = $tS;
}

要跟踪经过的时间,只需执行以下操作:

recordTime("What We Just Did")

例如:

recordTime("Something Else")
//Do really long operation.
recordTime("Really Long Operation")
//Do a short operation.
recordTime("A Short Operation")
//In a while loop.
for ($i = 0; $i < 300; $i ++) {
  recordTime("Loop Cycle ".$i)
}

给出这样的输出:

//     0.000 - Start
//     0.001 - Something Else In 0.001s
//    10.779 - Really Long Operation In 10.778s
//    11.986 - A Short Operation In 1.207s
//    11.987 - Loop Cycle 0 In 0.001s
//    11.987 - Loop Cycle 1 In 0.000s
...
//    12.007 - Loop Cycle 299 In 0.000s

希望这对某人有帮助!


2

这是非常简单和简短的方法

<?php
$time_start = microtime(true);
//the loop begin
//some code
//the loop end
$time_end = microtime(true);
$total_time = $time_end - $time_start;
echo $total_time; // or whatever u want to do with the time
?>

我认为您丢失了我发布答案时测试该代码的内容
Deepak Kumar

var_dump(microtime(true)); // float(1283846202.89)这就是使用microtime时的真实值
Deepak Kumar,

您还可以在总时间中使用float
Deepak Kumar,

2

如果您希望以秒为单位显示该时间:

<?php
class debugTimer 
{
    private $startTime;
    private $callsCounter;

    function __construct() 
    {
        $this->startTime = microtime(true);
        $this->callsCounter = 0;
    }

    public function getTimer(): float
    {
        $timeEnd = microtime(true);
        $time = $timeEnd - $this->startTime;
        $this->callsCounter++;
        return $time;
    }

    public function getCallsNumer(): int
    {
        return $this->callsCounter;
    }
}

$timer = new debugTimer();
usleep(100);
echo '<br />\n
'.$timer->getTimer(). ' seconds before call #'.$timer->getCallsNumer();

usleep(100);
echo '<br />\n
'.$timer->getTimer(). ' seconds before call #'.$timer->getCallsNumer();

1

这是一个返回小数秒(即1.321秒)的实现

/**
 * MICROSECOND STOPWATCH FOR PHP
 *
 * Class FnxStopwatch
 */
class FnxStopwatch
{
    /** @var float */
    private $start,
            $stop;

    public function start()
    {
        $this->start = self::microtime_float();
    }
    public function stop()
    {
        $this->stop = self::microtime_float();
    }
    public function getIntervalSeconds() : float
    {
        // NOT STARTED
        if (empty($this->start))
            return 0;
        // NOT STOPPED
        if (empty($this->stop))
            return ($this->stop - self::microtime_float());

        return $interval = $this->stop - $this->start;
    }

    /**
     * FOR MORE INFO SEE http://us.php.net/microtime
     *
     * @return float
     */
    private static function microtime_float() : float
    {
        list($usec, $sec) = explode(" ", microtime());

        return ((float)$usec + (float)$sec);
    }
}

1

这是我用来测量平均时间的脚本

<?php

$times = [];
$nbrOfLoops = 4;
for ($i = 0; $i < $nbrOfLoops; ++$i) {
    $start = microtime(true);
    sleep(1);
    $times[] = microtime(true) - $start;
}

echo 'Average: ' . (array_sum($times) / count($times)) . 'seconds';

0

您可以通过一个函数以秒为单位找到执行时间。

// ampersand is important thing here
function microSec( & $ms ) {
    if (\floatval( $ms ) == 0) {
        $ms = microtime( true );
    }
    else {
        $originalMs = $ms;
        $ms = 0;
        return microtime( true ) - $originalMs;
    }
}

// you don't have to define $ms variable. just function needs
// it to calculate the difference.
microSec($ms);
sleep(10);
echo microSec($ms) . " seconds"; // 10 seconds

for( $i = 0; $i < 10; $i++) {
    // you can use same variable everytime without assign a value
    microSec($ms);
    sleep(1);
    echo microSec($ms) . " seconds"; // 1 second
}

for( $i = 0; $i < 10; $i++) {
    // also you can use temp or useless variables
    microSec($xyzabc);
    sleep(1);
    echo microSec($xyzabc) . " seconds"; // 1 second
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.