七)CodeIgniter源碼分析之Benchmark.php

 1 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 2 // 
 3 
 4 /**
 5  * CodeIgniter Benchmark Class
 6  */
 7 class CI_Benchmark {
 8 
 9  /**
10   * List of all benchmark markers and when they were added
11   */
12  var $marker = array();
13 
14  // --
15 
16  /**
17   * Set a benchmark marker
18   */
19  function mark($name)
20  {
21   //这个方法其实很简单,就是在程序的任意地方调用地方法时,会记录当前的时间点。
22   $this->marker[$name] = microtime();
23  }
24 
25  // --
26 
27  /**
28   * Calculates the time difference between two marked points.
29   * 计算出两个时间点之间的时间。
30   */
31  function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
32  {
33   /*
34    * 如果没有给出明确的时间点,那么会计算出整个程序运行的时间。
35    * 怎么可以做到计算出整个程序的运行时间的呢?其实执行此计算的是Output组件。
36    * 而调用Benchmark::elapsed_time();(无参数)的时候,实质上先返回的并不是
37    * 整个程序运行的时间,也不可能做到,实质返回的是一个{elapsed_time}标签,然后
38    * Output在处理输出的时候,再计算出整个程序运行时间,因为处理输出阶段程序可以视
39    * 为处于最后阶段,于是可以近似计算出总时间,然后把输出中的{elapsed_time}替换掉。
40    * 下面的memory_usage()原理相同。
41    * 详见:core/Output.php 中的_display()方法。
42    */
43   if ($point1 == '')
44   {
45    return '{elapsed_time}';
46   }
47 
48   if ( ! isset($this->marker[$point1]))
49   {
50    return '';
51   }
52 
53   if ( ! isset($this->marker[$point2]))
54   {
55    $this->marker[$point2] = microtime();
56   }
57 
58   //这里为什么要用到list,是因为microtime();返回值是“msec sec”的格式。
59   list($sm, $ss) = explode(' ', $this->marker[$point1]);
60   list($em, $es) = explode(' ', $this->marker[$point2]);
61 
62   return number_format(($em + $es) - ($sm + $ss), $decimals);
63  }
64 
65  // --
66 
67  /**
68   * Memory Usage
69   */
70  function memory_usage()
71  {
72   //Output::_display();
73   return '{memory_usage}';
74  }
75 
76 }

 

更多相关文章
一周排行