我想知道一个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
我想知道一个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
Answers:
microtime
—返回当前的Unix时间戳(以微秒为单位)
如果
get_as_float
将设置为TRUE
,则microtime()
返回一个浮点数,它表示自Unix时期精确到最接近的微秒的当前时间(以秒为单位)。
用法示例:
$start = microtime(true);
while (...) {
}
$time_elapsed_secs = microtime(true) - $start;
microtime(true)
如果要使用返回值进行计算,则需要。
get_as_float
为true
)将以秒为单位提供结果。
get_as_float
是true
,则microtime()
返回代表秒数的值...
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
更多信息请参见下面的答案。)
您可以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
。
您可以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;
$myscripttime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
在脚本的末尾,而不必在开始时保存时间戳。
$time
将包含以秒为单位的差异,而不是以微秒为单位。
1.1
等于1秒+ 100微秒。
创建文件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”
</html>
无效的结束标记之后
$start = microtime(true);
for ($i = 0; $i < 10000; ++$i) {
// do something
}
$total = microtime(true) - $start;
echo $total;
参见microtime()。
这是一个计时任何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
您有一个正确的想法,除了可以使用microtime()获得更精确的计时函数。
如果循环内部的速度很快,则表观的经过时间可能为零。如果是这样,请在代码周围包裹另一个循环并重复调用它。确保将差值除以迭代次数以得到一次。我分析了代码,该代码需要10,000,000次迭代才能获得一致,可靠的时序结果。
我以为我会分享自己的功能。希望它可以节省您的时间。
它最初用于跟踪基于文本的脚本的计时,因此输出为文本形式。但是,如果愿意,您可以轻松地将其修改为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
希望这对某人有帮助!
这是非常简单和简短的方法
<?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
?>
如果您希望以秒为单位显示该时间:
<?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.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);
}
}
您可以通过一个函数以秒为单位找到执行时间。
// 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
}