我想知道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
答案 0 :(得分:452)
您可以使用microtime
功能。来自the documentation:
microtime
- 以微秒返回当前的Unix时间戳
如果
get_as_float
设置为TRUE
,那么microtime()
将返回一个浮点数,表示自Unix纪元精确到最接近的微秒以来的当前时间(以秒为单位)。
使用示例:
$start = microtime(true);
while (...) {
}
$time_elapsed_secs = microtime(true) - $start;
答案 1 :(得分:78)
您可以按照以下方式使用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
。
答案 2 :(得分:66)
您可以使用REQUEST_TIME
超全局数组中的$_SERVER
。 From the documentation:
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微秒)
答案 3 :(得分:26)
创建文件加载time.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();
当页面在末尾加载时,将写入“在x秒内加载”
答案 4 :(得分:17)
$start = microtime(true);
for ($i = 0; $i < 10000; ++$i) {
// do something
}
$total = microtime(true) - $start;
echo $total;
答案 5 :(得分:7)
请参阅microtime()。
答案 6 :(得分: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
的独立自包含项目答案 7 :(得分:5)
你有正确的想法,除了microtime()功能提供更准确的时间。
如果循环内部的内容很快,则表观经过的时间可能为零。如果是这样,请在代码周围再换一个循环并重复调用它。务必将差异除以迭代次数以获得每次一次。我有一个配置代码,需要10,000,000次迭代才能获得一致,可靠的时序结果。
答案 8 :(得分: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
?>
答案 9 :(得分:2)
我以为我会分享我放在一起的功能。希望它可以节省你的时间。
它最初用于跟踪基于文本的脚本的计时,因此输出采用文本形式。但如果您愿意,可以轻松将其修改为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
希望这有助于某人!
答案 10 :(得分: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();
答案 11 :(得分: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);
}
}
答案 12 :(得分: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';
答案 13 :(得分: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
}