我希望能够测量两段代码之间的经过时间。这仅仅是为了能够检测代码中的瓶颈并改进可以改进的内容。
我想设计一个函数,其中函数应该使用全局变量,该变量回显当前调用和上次调用之间经过的时间。
这样,你可以一个接一个地使用它。
该功能应该能够计算分数秒的差异,例如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实用程序(内置函数)来实现这种输出?
答案 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)
其他因素会影响脚本的时间安排。例如:
答案 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;
}
}
它旨在通过后续的start(<tag>)
和stop(<tag>)
来电调用。它生成一个数组,其中包含代码在start()和stop()调用所包含的部分中使用匹配标记的总时间。
起止序列可以嵌套,可以多次输入,从而总结在封闭部分花费的时间。
其紧凑性确保最小的性能影响。动态标签创建可用于让程序修改它监控的内容。通常,这会通过输出或存储功能进行扩展。