CodeIgniter框架源码笔记(8)——性能调试:基准测试类Benchmark.php

在性能调试过程中,我们想更精确的了解类库加载时间,控制器方法执行时间,缓存操作时间怎么做?或者我们想很俗气的在网站底部显示一个:本次加载耗时0.007s应该怎么做?CI框架提供了一个叫Benchmark的基准测试类,用于计算两个标记点之间的时间差。
使用流程如下:
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 内存的峰值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值