CI框架源代码阅读笔记5 基准測试 BenchMark.php

简介:
   上一篇博客( CI框架源代码阅读笔记4 引导文件CodeIgniter.php )中。我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的。这些组件类似于一个一个单独的模块,不同的模块完毕不同的功能,各模块之间能够相互调用,共同构成了CI的核心骨架。

    从本篇開始,将进一步去分析各组件的实现细节。深入CI核心的黑盒内部(研究之后。事实上就应该是白盒了,只对于应用来说,它应该算是黑盒),从而更好的去认识、把握这个框架。

    依照惯例。在開始之前。我们贴上CI中不全然的核心组件图:

 

  因为BenchMark是CI中第一个载入的core组件,因此我们的分析首先从该组件開始。

BenchMark的含义很明白,使用过BenchMark工具的同学应该比較清楚。这是一个基准组件。既然是BenchMark,我们便可大胆猜想,BM组件的主要功能就是记录程序的执行时间、内存使用、cpu使用等情况。

先看类图:

 

这个组件结构较简单,仅仅有一个marker内部变量和三个对外的接口:

1 Elapsed_time
2 Mark
3 Memory_usage

以下一个个展开来看:

1.  mark

函数的签名为:

function mark($name)

这个函数接受一个string类型的參数,而实现更简单。仅仅有一句话:

$this->marker[$name] = microtime();

也就是说这个函数仅仅是用于记录函数调用时刻的时间点。

值得注意的是。因为Controller中的特殊处理(之后我们会详解),你的应用程序控制器中能够使用$this->benchmark->mark($name);的方式来加入执行的时间点。比如:

$this->benchmark->mark("function_test_start");
$this->_test();
$this->benchmark->mark("function_test_end");
print_r($this->benchmark);

当中,function_test_startfunction_test_end分别用于记录函数调用開始和结束的时间点

打印出的结果:

 

如今要计算函数的调用时间,须要用到BenchMark组件的第二个函数elapsed_time

2.  elapsed_time

函数的签名为:

function elapsed_time($point1 = '', $point2 = '', $decimals = 4)

3个參数均为可选參数

(1).   假设$point1 为空,则返回’{elapsed_time}’

if ($point1 == '') {
     return '{elapsed_time}';
}

纳尼!

明明应该返回的是时间,怎么反而返回的是字符串,并且这么奇怪(类似smarty的标签)。

事实上,在Output组件中,{elapsed_time}会被替换。我们临时看一下替换的方式:

$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');
$output = str_replace('{elapsed_time}', $elapsed, $output);

也就是说。没有指定參数的情况下,调用该函数实际得到的是total_execution_time_start这个时间点到total_execution_time_end这个时间点的时间差。更进一步,因为total_execution_time_start是在BM载入之后设置的第一个mark点(total_execution_time_end并没有定义,返回的是当前时间点),该函数返回的实际就是系统的载入和执行时间。

(2).假设调用的是未知的mark点。则结果是未知的。直接返回空:

if ( ! isset($this->marker[$point1]))
{
    return '';
}

(3).假设没有设置$point2的mark点。则将$point2的mark点设置为当前的时间点。

if ( ! isset($this->marker[$point2]))
{
    $this->marker[$point2] = microtime();
}

(4).最后返回的两个mark点的时间差:

list($sm, $ss) = explode(' ', $this->marker[$point1]);
list($em, $es) = explode(' ', $this->marker[$point2]);

return number_format(($em + $es) - ($sm + $ss), $decimals);

还看之前的样例。这里我们能够通过调用:

echo $this->benchmark->elapsed_time("function_test_start","function_test_end");

得到函数的运行时间.

3.  memory_usage

这个函数返回的是系统的内存使用情况(MB单位),与{elapsed_time} 一样,这个函数返回的{memory_usage}也会在Output中被替换:

$memory  = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
$output = str_replace('{memory_usage}', $memory, $output);

因为BenchMark组件本身较简单,我们不做很多其它的解释。

最后。贴上这个组件的源代码:

复制代码
<?php

class CI_Benchmark {

    /**
     * List of all benchmark markers and when they were added
     *
     * @var array
     */
    var $marker = array();

    /**
     * Set a benchmark marker
     *
     * @access    public
     * @param    string    $name    name of the marker
     * @return    void
     */
    function mark($name)
    {
        $this->marker[$name] = microtime();
    }

    /**
     * Calculates the time difference between two marked points.
     * If the first parameter is empty this function instead returns the {elapsed_time} pseudo-variable. This permits the full system
     * @access    public
     * @param    string    a particular marked point
     * @param    string    a particular marked point
     * @param    integer    the number of decimal places
     * @return    mixed
     */
    function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
    {
        if ($point1 == '')
        {
            return '{elapsed_time}';
        }

        if ( ! isset($this->marker[$point1]))
        {
            return '';
        }

        if ( ! isset($this->marker[$point2]))
        {
            $this->marker[$point2] = microtime();
        }

        list($sm, $ss) = explode(' ', $this->marker[$point1]);
        list($em, $es) = explode(' ', $this->marker[$point2]);

        return number_format(($em + $es) - ($sm + $ss), $decimals);
    }

    /**
     * Memory Usage
     * This function returns the {memory_usage} pseudo-variable.
     */
    function memory_usage()
    {
        return '{memory_usage}';
    }


}






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5275290.html,如需转载请自行联系原作者

相关文章
|
1月前
|
SQL 安全 PHP
PHP 自发布以来一直在 Web 开发领域占据重要地位,PHP 8 更是带来了属性、刚性类型等新特性。
【10月更文挑战第1天】PHP 自问世以来,凭借其易用性和灵活性,在 Web 开发领域迅速崛起。从简单的网页脚本语言逐步演进为支持面向对象编程的现代语言,尤其自 PHP 5.3 引入命名空间后,代码组织和维护变得更加高效。PHP 7 的性能优化和 PHP 8 的新特性(如属性和刚性类型)进一步巩固了其地位。框架如 Laravel、Symfony、Yii2 和 CodeIgniter 等简化了开发流程,提高了效率和安全性。
44 2
|
7天前
|
API PHP 数据库
PHP中哪个框架最适合做API?
在数字化时代,API作为软件应用间通信的桥梁至关重要。本文探讨了PHP中适合API开发的主流框架,包括Laravel、Symfony、Lumen、Slim、Yii和Phalcon,分析了它们的特点和优势,帮助开发者选择合适的框架,提高开发效率、保证接口稳定性和安全性。
24 3
|
11天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
18 3
|
13天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP 自发布以来一直在 Web 开发领域占据重要地位,历经多次重大更新,从简单的脚本语言进化为支持面向对象编程的现代语言。本文探讨 PHP 的演进历程,重点介绍其在 Web 开发中的应用及框架创新。自 PHP 5.3 引入命名空间后,PHP 迈向了面向对象编程时代;PHP 7 通过优化内核大幅提升性能;PHP 8 更是带来了属性、刚性类型等新特性。
23 3
|
1月前
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
360 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
1月前
|
测试技术
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
本文是关于自动化测试项目实战笔记,主要介绍了如何测试用户注册功能,包括验证码错误、注册成功以及弹框处理的测试步骤和代码实现。
84 2
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
|
1月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
49 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
1月前
|
安全
红队测试方法论-课程笔记
红队测试方法论-课程笔记
红队测试方法论-课程笔记
|
30天前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
|
1月前
|
计算机视觉
目标检测笔记(二):测试YOLOv5各模块的推理速度
这篇文章是关于如何测试YOLOv5中不同模块(如SPP和SPPF)的推理速度,并通过代码示例展示了如何进行性能分析。
81 3