From e26611f93bfb21f5e143cc91ce529f6db52cdd88 Mon Sep 17 00:00:00 2001
From: admin
Date: Mon, 2 Oct 2006 21:59:12 +0000
Subject:
---
system/codeigniter/CodeIgniter.php | 2 +-
system/libraries/Benchmark.php | 32 +++++++++++++++++
system/libraries/Output.php | 70 ++++++++++++++++++++++++++++++++++---
user_guide/general/changelog.html | 1 +
user_guide/libraries/benchmark.html | 54 +++++++++++++++++++++++++++-
5 files changed, 152 insertions(+), 7 deletions(-)
diff --git a/system/codeigniter/CodeIgniter.php b/system/codeigniter/CodeIgniter.php
index a4f18b0e1..32c08c8f0 100644
--- a/system/codeigniter/CodeIgniter.php
+++ b/system/codeigniter/CodeIgniter.php
@@ -51,7 +51,7 @@ set_magic_quotes_runtime(0); // Kill magic quotes
*/
$BM =& _load_class('Benchmark');
-$BM->mark('code_igniter_start');
+$BM->mark('total_execution_time_start');
/*
* ------------------------------------------------------
diff --git a/system/libraries/Benchmark.php b/system/libraries/Benchmark.php
index d8dd903e7..feedbf570 100644
--- a/system/libraries/Benchmark.php
+++ b/system/libraries/Benchmark.php
@@ -85,6 +85,38 @@ class CI_Benchmark {
// --------------------------------------------------------------------
+ /**
+ * Auto Profiler
+ *
+ * This function cycles through the entire array of mark points and
+ * matches any two points that are named identially (ending in "_start"
+ * and "_end" respectively). It then compiles the execution times for
+ * all points and returns it as an array
+ *
+ * @access public
+ * @return array
+ */
+ function auto_profiler()
+ {
+ $marker_keys = array_reverse(array_keys($this->marker));
+
+ $times = array();
+ foreach ($marker_keys as $val)
+ {
+ if (preg_match("/(.+?)_start/i", $val, $match))
+ {
+ if (isset($this->marker[$match[1].'_end']))
+ {
+ $times[$match[1]] = $this->elapsed_time($val, $match[1].'_end');
+ }
+ }
+ }
+
+ return $times;
+ }
+
+ // --------------------------------------------------------------------
+
/**
* Memory Usage
*
diff --git a/system/libraries/Output.php b/system/libraries/Output.php
index 1c3f0d604..b5b7c9e97 100644
--- a/system/libraries/Output.php
+++ b/system/libraries/Output.php
@@ -31,6 +31,7 @@ class CI_Output {
var $final_output;
var $cache_expiration = 0;
var $headers = array();
+ var $enable_profiler = FALSE;
function CI_Output()
{
@@ -89,6 +90,20 @@ class CI_Output {
// --------------------------------------------------------------------
+ /**
+ * Enable/disable Profiler
+ *
+ * @access public
+ * @param bool
+ * @return void
+ */
+ function enable_profiler($val = TRUE)
+ {
+ $this->enable_profiler = (is_bool($val)) ? $val : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
/**
* Set Cache
*
@@ -123,7 +138,7 @@ class CI_Output {
*/
function _display($output = '')
{
- // Note: We can't use $obj =& _get_instance() since this function
+ // Note: We can't use $obj =& get_instance() since this function
// is sometimes called by the caching mechanism, which happens before
// it's available. Instead we'll use globals...
global $BM, $CFG;
@@ -141,7 +156,7 @@ class CI_Output {
// Parse out the elapsed time and memory usage, and
// swap the pseudo-variables with the data
- $elapsed = $BM->elapsed_time('code_igniter_start', 'code_igniter_end');
+ $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');
$memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
$output = str_replace('{memory_usage}', $memory, $output);
@@ -166,14 +181,28 @@ class CI_Output {
{
@header($header);
}
- }
+ }
// Send the finalized output either directly
// to the browser or to the user's _output()
// function if it exists
- if (function_exists('_get_instance') AND method_exists($obj, '_output'))
+ if (function_exists('get_instance'))
{
- $obj->_output($output);
+ $obj =& get_instance();
+
+ if ($this->enable_profiler == TRUE)
+ {
+ $output .= $this->_run_profiler();
+ }
+
+ if (method_exists($obj, '_output'))
+ {
+ $obj->_output($output);
+ }
+ else
+ {
+ echo $output; // Send it to the browser!
+ }
}
else
{
@@ -295,6 +324,37 @@ class CI_Output {
return TRUE;
}
+ // --------------------------------------------------------------------
+
+ /**
+ * Run the Auto-profiler
+ *
+ * @access private
+ * @return string
+ */
+ function _run_profiler()
+ {
+ $obj =& get_instance();
+
+ $profile = $obj->benchmark->auto_profiler();
+
+ $output = '';
+ if (count($profile) > 0)
+ {
+ $output .= "\n\n\n";
+
+ foreach ($profile as $key => $val)
+ {
+ $key = ucwords(str_replace(array('_', '-'), ' ', $key));
+ $output .= "".$key." | ".$val." |
\n";
+ }
+
+ $output .= "
\n";
+ }
+
+ return $output;
+ }
+
}
// END Output Class
?>
\ No newline at end of file
diff --git a/user_guide/general/changelog.html b/user_guide/general/changelog.html
index 1cac05dca..df4d0f1b8 100644
--- a/user_guide/general/changelog.html
+++ b/user_guide/general/changelog.html
@@ -73,6 +73,7 @@ Change Log
Added relationship capability to the database active record class
Added Zip Encoding Library permitting files to be Zip compressed.
Added the ability to extend libraries and extend core classes, in addition to being able to replace them.
+Added Auto Profiler to the Benchmark Class, enabling you to generate a report of execution times.
Added support for storing models within sub-folders.
Added Download Helper.
Added simple_query() function to the database classes
diff --git a/user_guide/libraries/benchmark.html b/user_guide/libraries/benchmark.html
index 7f3e28bf5..b8b0bfd32 100644
--- a/user_guide/libraries/benchmark.html
+++ b/user_guide/libraries/benchmark.html
@@ -73,7 +73,20 @@ two marked points to be calculated.
invoked, and ended by the output class right before sending the final view to the browser, enabling a very accurate
timing of the entire system execution to be shown.
-Using the Benchmark
+
+Table of Contents
+
+
+
+
+
+
+Using the Benchmark Class
The Benchmark class can be used within your controllers, views, or your Models. The process for usage is this:
@@ -111,6 +124,7 @@ echo $this->benchmark->elapsed_time('cat', 'bird');
echo $this->benchmark->elapsed_time('dog', 'bird');
+
Displaying Total Execution Time
If you would like to display the total elapsed time from the moment Code Igniter starts to the moment the final output
@@ -128,6 +142,7 @@ output is sent to the browser. It doesn't matter where you use the function cal
Note: If you want to benchmark anything within your controller
functions you must set your own start/end points.
+
Displaying Memory Consumption
If your PHP installation is configured with --enable-memory-limit, you can display the amount of memory consumed by the entire
@@ -140,6 +155,43 @@ system using the following code in one of your view file:
{memory_usage}
+
+Auto Profiler
+
+When the "auto profiler" is enabled, you'll see a report printed at the bottom of your pages containing a list of
+execution times for all benchmarks you have set throughout your application. This information can help you optimize your program.
+
+Note: Even though this is a feature of the Benchmark class you will enable it from the Output class as indicated below.
+
+To enable the profiler place the the following function anywhere within your Controllers:
+$this->output->enable_profiler(TRUE);
+
+When enabled you'll see a table of execution times at the bottom of your pages.
+
+To disable the profiler you will use:
+$this->output->enable_profiler(FALSE);
+
+Important: In order to use this feature all of your marked points must end with _start and _end, and
+each pair of points must otherwise be named identically. Example:
+
+
+$this->benchmark->mark('my_mark_start');
+
+// Some code happens here...
+
+$this->benchmark->mark('my_mark_end');
+
+
+$this->benchmark->mark('another_mark_start');
+
+// Some more code happens here...
+
+$this->benchmark->mark('another_mark_end');
+
+
+
+
+
--
cgit v1.2.3-24-g4f1b