在性能调试过程中,我们想更精确的了解类库加载时间,控制器方法执行时间,缓存操作时间怎么做?或者我们想很俗气的在网站底部显示一个:本次加载耗时0.007s应该怎么做?CI框架提供了一个叫Benchmark的基准测试类,用于计算两个标记点之间的时间差。
使用流程如下:
1、标记一个起始点
2、标记一个结束点
3、使用 elapsed_time 函数计算时间差。
如果elapsed_time不带任何参数,就可以显示从 CodeIgniter 运行开始到最终结果输出到浏览器之间花费的总时间。
来分析一下Benchmark类如何做到这些
在CodeIgniter.php中可以看到在composer autoload代码块后设置起始点$BM->mark('total_execution_time_start');
total_execution_time_end点是不存在的,elapsed_time方法会插入一个同名点,并用当前时间赋值。
<?php echo $this->benchmark->memory_usage();?>也可以{memory_usage}
这个方法只能在视图文件中使用,显示的结果代表整个应用所占用的内存大小。
方法很简单,就是返回 {memory_usage}
$memory = round(memory_get_usage() / 1024 / 1024, 2).'MB';
然后用$memory替换了{memory_usage}
这个核心函数是memory_get_usage()函数,
函数原型int memory_get_usage ([ bool $real_usage = false ] )。如果$real_usage设置为 TRUE,获取系统分配的真实内存尺寸。如果未设置或者设置为 FALSE,将是 emalloc() 报告使用的内存量。
php5.2.1 后不需要在编译时使用 --enable-memory-limit选项就能够使用这个函数
microtime()返回的结果是以 "msec sec" 的格式返回一个字符串,其中 sec(时间戳) 是自 Unix 纪元起到现在的秒数,与time()返回的结果一样。msec 是微秒部分。microtime(true)返回的值是sec+msec的和,保留四位小数。
memory_get_usage可以分析内存占用空间,php5.2.1 后不需要在编译时使用 --enable-memory-limit选项就能够使用这个函数
memory_get_peak_usage()可以返回分配给 PHP 内存的峰值
使用流程如下:
1、标记一个起始点
2、标记一个结束点
3、使用 elapsed_time 函数计算时间差。
$this->benchmark->mark('page_init');
//......
//......
$this->benchmark->mark('page_end');
echo $this->benchmark->elapsed_time('code_start', 'code_end');
如果标记点名称成对出现并以 _start 和 _end 结束,那么可以用于性能分析器中显示这一基准测试数据。位于libraries下Profiler的_compile_benchmarks()方法会分析测试点mark数组中的KEY键,如果包含_start及_end的元素存在,会处理并显示到性能分析结果表中。
$this->benchmark->mark('my_mark_start');
// Some code happens here...
$this->benchmark->mark('my_mark_end');
如果elapsed_time不带任何参数,就可以显示从 CodeIgniter 运行开始到最终结果输出到浏览器之间花费的总时间。
<?php echo $this->benchmark->elapsed_time();?>
也可以把{elapsed_time}放在VIEW视图里。
来分析一下Benchmark类如何做到这些
一、$marker:Benchmark类内部用于存放所有标记点的数组
二、mark($name)方法,设置标记点,并插入一下key为标记名,值为当前时间的元素到$this->marker数组。
public function mark($name)
{
$this->marker[$name] = microtime(TRUE);
}
三、elapsed_time:计算间隔时间。
如果elapsed_time不带任何参数,就返加return '{elapsed_time}',而这个{elapsed_time}标记最终在output类中被替换成$BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');在CodeIgniter.php中可以看到在composer autoload代码块后设置起始点$BM->mark('total_execution_time_start');
total_execution_time_end点是不存在的,elapsed_time方法会插入一个同名点,并用当前时间赋值。
if ( ! isset($this->marker[$point2]))
{
$this->marker[$point2] = microtime(TRUE);
}
实际上最后就是输出当前调用elapsed_time函数的时间减去mark('total_execution_time_start')的时间的差值。
public function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
{
//如果第一个参数为空,即函数参数都为空的情况下,直接返回{elapsed_time}
if ($point1 === '')
{
return '{elapsed_time}';
}
//如果$point1标记点不存在,则返回空
if ( ! isset($this->marker[$point1]))
{
return '';
}
//如果$point2标记点不存在,则用当前时间生成一个$point2
if ( ! isset($this->marker[$point2]))
{
$this->marker[$point2] = microtime(TRUE);
}
return number_format($this->marker[$point2] - $this->marker[$point1], $decimals);
}
四、显示内存占用
在视图文件中 使用下面这行代码来显示整个系统所占用的内存大小:<?php echo $this->benchmark->memory_usage();?>也可以{memory_usage}
这个方法只能在视图文件中使用,显示的结果代表整个应用所占用的内存大小。
方法很简单,就是返回 {memory_usage}
public function memory_usage()
{
return '{memory_usage}';
}
具体实现是在输出类Output.php中实现的
$memory = round(memory_get_usage() / 1024 / 1024, 2).'MB';
然后用$memory替换了{memory_usage}
这个核心函数是memory_get_usage()函数,
函数原型int memory_get_usage ([ bool $real_usage = false ] )。如果$real_usage设置为 TRUE,获取系统分配的真实内存尺寸。如果未设置或者设置为 FALSE,将是 emalloc() 报告使用的内存量。
php5.2.1 后不需要在编译时使用 --enable-memory-limit选项就能够使用这个函数
归纳一下常用的检测:
用microtime函数可以分析程序执行时间。microtime — 返回当前 Unix 时间戳和微秒数microtime()返回的结果是以 "msec sec" 的格式返回一个字符串,其中 sec(时间戳) 是自 Unix 纪元起到现在的秒数,与time()返回的结果一样。msec 是微秒部分。microtime(true)返回的值是sec+msec的和,保留四位小数。
memory_get_usage可以分析内存占用空间,php5.2.1 后不需要在编译时使用 --enable-memory-limit选项就能够使用这个函数
memory_get_peak_usage()可以返回分配给 PHP 内存的峰值