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 }