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 .= "\n"; + } + + $output .= "
".$key."".$val."
\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