国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

CI框架源碼閱讀筆記5基準(zhǔn)測試BenchMark.php

2020-03-22 17:57:03
字體:
供稿:網(wǎng)友
  • 上一篇博客(CI框架源碼閱讀筆記4 引導(dǎo)文件CodeIgniter.php)中,我們已經(jīng)看到:CI中核心流程的核心功能都是由不同的組件來完成的。這些組件類似于一個(gè)一個(gè)單獨(dú)的模塊,不同的模塊完成不同的功能,各模塊之間可以相互調(diào)用,共同構(gòu)成了CI的核心骨架。

    從本篇開始,將進(jìn)一步去分析各組件的實(shí)現(xiàn)細(xì)節(jié),深入CI核心的黑盒內(nèi)部(研究之后,其實(shí)就應(yīng)該是白盒了,僅僅對于應(yīng)用來說,它應(yīng)該算是黑盒),從而更好的去認(rèn)識、把握這個(gè)框架。

    按照慣例,在開始之前,我們貼上CI中不完全的核心組件圖:

      由于BenchMark是CI中第一個(gè)加載的core組件,因此我們的分析首先從該組件開始。BenchMark的含義非常明確,使用過BenchMark工具的同學(xué)應(yīng)該比較清楚,這是一個(gè)基準(zhǔn)組件。既然是BenchMark,我們便可大膽猜想,BM組件的主要功能就是記錄程序的運(yùn)行時(shí)間、內(nèi)存使用、cpu使用等情況。

    先看類圖:

    這個(gè)組件結(jié)構(gòu)較簡單,只有一個(gè)marker內(nèi)部變量和三個(gè)對外的接口:

    1 Elapsed_time2 Mark3 Memory_usage

    下面一個(gè)個(gè)展開來看:

    1.  mark

    函數(shù)的簽名為:

    function mark($name)

    這個(gè)函數(shù)接受一個(gè)string類型的參數(shù),而實(shí)現(xiàn)更簡單,只有一句話:

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

    也就是說這個(gè)函數(shù)只是用于記錄函數(shù)調(diào)用時(shí)刻的時(shí)間點(diǎn)。

    值得注意的是,由于Controller中的特殊處理(之后我們會詳細(xì)解釋),你的html' target='_blank'>應(yīng)用程序控制器中可以使用$this->benchmark->mark($name);的方式來添加運(yùn)行的時(shí)間點(diǎn),例如:

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

    其中,function_test_start和function_test_end分別用于記錄函數(shù)調(diào)用開始和結(jié)束的時(shí)間點(diǎn)

    打印出的結(jié)果:

    現(xiàn)在要計(jì)算函數(shù)的調(diào)用時(shí)間,需要用到BenchMark組件的第二個(gè)函數(shù)elapsed_time

    2.  elapsed_time

    函數(shù)的簽名為:

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

    3個(gè)參數(shù)均為可選參數(shù)

    (1). 如果$point1 為空,則返回’{elapsed_time}’

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

    納尼!明明應(yīng)該返回的是時(shí)間,怎么反而返回的是字符串,而且這么奇怪(類似smarty的標(biāo)簽)。其實(shí),在Output組件中,{elapsed_time}會被替換,我們暫時(shí)看一下替換的方式:

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

    也就是說,沒有指定參數(shù)的情況下,調(diào)用該函數(shù)實(shí)際得到的是total_execution_time_start這個(gè)時(shí)間點(diǎn)到total_execution_time_end這個(gè)時(shí)間點(diǎn)的時(shí)間差。更進(jìn)一步,由于total_execution_time_start是在BM加載之后設(shè)置的第一個(gè)mark點(diǎn)(total_execution_time_end并未定義,返回的是當(dāng)前時(shí)間點(diǎn)),該函數(shù)返回的實(shí)際就是系統(tǒng)的加載和運(yùn)行時(shí)間。

    (2).如果調(diào)用的是未知的mark點(diǎn)。則結(jié)果是未知的,直接返回空:

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

    (3).如果沒有設(shè)置$point2的mark點(diǎn),則將$point2的mark點(diǎn)設(shè)置為當(dāng)前的時(shí)間點(diǎn)。

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

    (4).最后返回的兩個(gè)mark點(diǎn)的時(shí)間差:

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

    還看之前的例子,這里我們可以通過調(diào)用:

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

    得到函數(shù)的執(zhí)行時(shí)間.

    3.  memory_usage

    這個(gè)函數(shù)返回的是系統(tǒng)的內(nèi)存使用情況(MB單位),與{elapsed_time} 一樣,這個(gè)函數(shù)返回的{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組件本身較簡單,我們不做更多的解釋。

    最后,貼上這個(gè)組件的源碼:

    復(fù)制代碼
    <?phpclass 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}';    }}
    PHP編程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黔东| 德安县| 襄汾县| 库伦旗| 北宁市| 乌兰县| 沈丘县| 墨脱县| 和田县| 广宗县| 天水市| 太保市| 永寿县| 开封市| 延寿县| 汶川县| 汉源县| 泗阳县| 华池县| 望城县| 嵩明县| 沙坪坝区| 沛县| 长泰县| 黑河市| 福清市| 威海市| 上犹县| 昌图县| 金平| 宣威市| 新安县| 房山区| 镇雄县| 宜章县| 西乌| 新兴县| 宣汉县| 敦煌市| 阿克| 中西区|