Created
September 6, 2018 07:03
-
-
Save malja/78ac4523a588b65d052e9d3ae99e2c17 to your computer and use it in GitHub Desktop.
PHP class for measuring function execution time
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/***********************************************************************\ | |
| | |
| RunTime Class | |
| ============= | |
| Class to measuring the execution time of function or method. | |
| | |
| Author: malja <github.com/malja> | |
| Version: 1.0 | |
| Created: 26. 8. 2013 | |
| | |
| Licence: CC-BY ( http://creativecommons.org/licenses/by/3.0/ ) | |
| | |
| --------------------------------------------------------------------- | |
| | |
| Example | |
| ======= | |
| | |
| Note: Considering you have a class with name "MyClassName" with public | |
| method "methodName". Method must take three arguments (int, int, | |
| string). | |
| | |
| $time = new RunTime(); | |
| $time->runMethod("MyClassName", "methodName", array(5,4, "Hi"), 500) | |
| echo $time->getString(); | |
| | |
\***********************************************************************/ | |
class RunTime { | |
private $time_iterations; | |
private $time_iteration_start; | |
private $time_overall; | |
private $arguments_string; | |
private $round_at; | |
/** | |
* Constructor | |
**/ | |
public function __construct() { | |
$this->time_iterations = array(); | |
} | |
/** | |
* Call simple function $iterations times and save the overall time | |
* | |
* string $function - Name of function which should be tested | |
* array $arguments - Array of arguments for function | |
* int $iterations - Number of loops | |
**/ | |
public function runFunction($function, $arguments, $iterations = 1) { | |
// If function with given name does not exists | |
if (!function_exists($function)) { | |
// Create new Exception with error message | |
throw new Exception("Function " . $function . " does not exists."); | |
} | |
// If loops count is lower than/equals zero | |
if ($iterations <= 0) { | |
// Stop working ... | |
return; | |
} | |
// If variable $arguments is not of type array | |
if (!is_array($arguments)) { | |
// Make it an array | |
$arguments = array($arguments); | |
} | |
// Loop | |
for ($it = 0; $it != $iterations; $it++) { | |
// Get start time | |
$this->time_iteration_start = microtime(true); | |
// Call given function | |
call_user_func_array($function, $arguments); | |
// Get finish time (current_time - startime) and save it to array for later | |
array_push($this->time_iterations, microtime(true) - $this->time_iteration_start); | |
} | |
// Count the overall time of all calls | |
$this->time_overall = array_sum($this->time_iterations); | |
} | |
/** | |
* Call method (member function) of class $iterations times and save the overall time | |
* | |
* string $class - Class name | |
* string $method - Method name of given class_alias | |
* array $arguments - Array of arguments for function_exists | |
* int $iterations - Number of loops | |
**/ | |
public function runMethod($class, $method, $arguments, $iterations = 1) { | |
// If class with given name does not exists | |
if (!class_exists($class)) { | |
// Create an new Exception with error message | |
throw new Exception("Class " . $class . " does not exists."); | |
} | |
// Create new instance of class | |
$classInstance = new $class(); | |
// If our class does not have method with given name | |
if (!method_exists($class, $method)) { | |
// Again throw an Exception with error message | |
throw new Exception("Class " . $class . " does not have method " . $method . "."); | |
} | |
// If the number of loops is lower than/equals zero | |
if ($iterations <= 0) { | |
// Do nothing ... | |
return; | |
} | |
// If $arguments parameter is not of type array | |
if (!is_array($arguments)) { | |
// Make it an array | |
$arguments = array($arguments); | |
} | |
// Main loop | |
for ($it = 0; $it != $iterations; $it++) { | |
// Get start time | |
$this->time_iteration_start = microtime(true); | |
// Call given method | |
call_user_func_array(array($classInstance, $method), $arguments); | |
// Save finish time (current_time - start_time) and push it to array | |
array_push($this->time_iterations, microtime(true) - $this->time_iteration_start); | |
} | |
// Count the overall time for later | |
$this->time_overall = array_sum($this->time_iterations); | |
} | |
/** | |
* int [$round] - Number of decimal points (default = 6) | |
**/ | |
public function getString($round = 6) { | |
// Sort the array of iterations time from the highest to the lowest | |
$this->time_time_iterations = arsort($this->time_iterations); | |
// What if the $round parameter is not of type int? | |
if (!is_numeric($round) || $round < 0) { | |
// Set it to default value | |
$round = 6; | |
} | |
// Print output | |
return "Iterations: " . count($this->time_iterations) . "<br/>" . | |
"Total time: " . number_format($this->time_overall, $round) . "s<br/>" . | |
"Max time: " . number_format($this->time_iterations[0], $round) . "s<br/>" . | |
"Average time: " . number_format($this->time_overall / count($this->time_iterations), $round) . "s<br/>" . | |
"Min time: " . number_format($this->time_iterations[count($this->time_iterations)-1] , $round) . "s<br/>"; | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment