Initial commit
commit
d12f197345
@ -0,0 +1,2 @@
|
|||||||
|
.idea/
|
||||||
|
vendor/
|
@ -0,0 +1,60 @@
|
|||||||
|
# PHPExecutionTimer
|
||||||
|
__Utility class for execution time measurement__
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
A utility class to measure and display execution time.
|
||||||
|
Include step time measurement.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
```
|
||||||
|
composer require darkelfe14728/executiontimer
|
||||||
|
```
|
||||||
|
|
||||||
|
[comment]: <> (## Description)
|
||||||
|
|
||||||
|
[comment]: <> (At first, create a new CommandLine with program name and description. Add options and values by using respectively _addOption_ and _addValue_.)
|
||||||
|
|
||||||
|
[comment]: <> (Default options for help (-h / --help) and version (--version) can be add with _addDefaultArguments_ and use _treatDefaultArguments_ for launching associated treatments.)
|
||||||
|
|
||||||
|
[comment]: <> (Treat script arguments with _parse_ : return an object of variables.)
|
||||||
|
|
||||||
|
[comment]: <> (## Example )
|
||||||
|
|
||||||
|
[comment]: <> (```php)
|
||||||
|
|
||||||
|
[comment]: <> (<?php)
|
||||||
|
|
||||||
|
[comment]: <> (use CommandLine\CommandLine;)
|
||||||
|
|
||||||
|
[comment]: <> (use CommandLine\Argument\Option\Flag;)
|
||||||
|
|
||||||
|
[comment]: <> (use CommandLine\Argument\Parser\StringParser;)
|
||||||
|
|
||||||
|
[comment]: <> (use CommandLine\Argument\Value\Value;)
|
||||||
|
|
||||||
|
[comment]: <> ($cmdline = new CommandLine('Checker', 'File checker', 'php checker.php');)
|
||||||
|
|
||||||
|
[comment]: <> ($cmdline->addDefaultArguments();)
|
||||||
|
|
||||||
|
[comment]: <> ($cmdline->addOption(new Flag('enhanced', false, 'Deep check ?'));)
|
||||||
|
|
||||||
|
[comment]: <> ($cmdline->addValue(new Value('path', 'File path', new StringParser()));)
|
||||||
|
|
||||||
|
[comment]: <> (var_dump($args = $cmdline->parse());)
|
||||||
|
|
||||||
|
[comment]: <> ($cmdline->treatDefaultArguments($args);)
|
||||||
|
|
||||||
|
[comment]: <> (```)
|
||||||
|
|
||||||
|
[comment]: <> (Would display something like that : )
|
||||||
|
|
||||||
|
[comment]: <> ( class stdClass#13 (1) {)
|
||||||
|
|
||||||
|
[comment]: <> ( public $enhanced => bool(false))
|
||||||
|
|
||||||
|
[comment]: <> ( public $path => string("my/path/to/a/file"))
|
||||||
|
|
||||||
|
[comment]: <> ( })
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../vendor/autoload.php';
|
||||||
|
|
||||||
|
use jrosset\ExecutionTimer\ExecutionTimer;
|
||||||
|
|
||||||
|
$timer = new ExecutionTimer(false);
|
||||||
|
$timer->start();
|
||||||
|
|
||||||
|
sleep(3);
|
||||||
|
|
||||||
|
$timer->step('sleep 1');
|
||||||
|
var_dump($timer->getLastStepRelativeDuration()->toUserString(), (string)$timer->getLastStepDuration());
|
||||||
|
|
||||||
|
sleep(2);
|
||||||
|
|
||||||
|
$timer->step('sleep 2');
|
||||||
|
var_dump($timer->getLastStepRelativeDuration()->toUserString(), (string)$timer->getLastStepDuration());
|
||||||
|
$timer->stop();
|
||||||
|
|
||||||
|
var_dump($timer->getStepsDuration());
|
||||||
|
|
||||||
|
$final = $timer->getDuration();
|
||||||
|
var_dump($timer->getRelativeDuration()->toUserString(), (string)$final);
|
||||||
|
var_dump($final->getMilliseconds(), $final->getMilliseconds()->asAbsoluteFactional(), $final->getMilliseconds()->asRelativeFactional());
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "darkelfe14728/executiontimer",
|
||||||
|
"description": "Utility class for execution time measurement",
|
||||||
|
"keywords": [ "time" ],
|
||||||
|
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"require": {
|
||||||
|
"php": "^5.3 || ^7 || 8.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"jrosset\\": "src/"
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [ "Tests/" ]
|
||||||
|
},
|
||||||
|
|
||||||
|
"readme": "README.md",
|
||||||
|
"homepage": "https://git.jrosset.ovh/darkelfe14728/PhpExecutionTimer",
|
||||||
|
"license": "CC-BY-4.0",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Julien Rosset",
|
||||||
|
"email": "jul.rosset@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "jul.rosset@gmail.com",
|
||||||
|
"issues": "https://git.jrosset.ovh/darkelfe14728/PhpExecutionTimer/issues",
|
||||||
|
"wiki": "https://git.jrosset.ovh/darkelfe14728/PhpExecutionTimer/wiki",
|
||||||
|
"docs": "https://git.jrosset.ovh/darkelfe14728/PhpExecutionTimer/wiki",
|
||||||
|
"source": "https://git.jrosset.ovh/darkelfe14728/PhpExecutionTimer"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"This file locks the dependencies of your project to a known state",
|
||||||
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"content-hash": "69d55a6bf0edcd4bb090526db2f1b47d",
|
||||||
|
"packages": [],
|
||||||
|
"packages-dev": [],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"stability-flags": [],
|
||||||
|
"prefer-stable": false,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": {
|
||||||
|
"php": "^5.3 || ^7 || 8.0"
|
||||||
|
},
|
||||||
|
"platform-dev": [],
|
||||||
|
"plugin-api-version": "1.1.0"
|
||||||
|
}
|
@ -0,0 +1,128 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace jrosset\ExecutionTimer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a time duration
|
||||||
|
*/
|
||||||
|
class Duration {
|
||||||
|
const EPSILON = 0.0000001;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var float The time duration
|
||||||
|
*/
|
||||||
|
private $duration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Duration constructor.
|
||||||
|
*
|
||||||
|
* @param float $duration Time duration, in seconds fraction
|
||||||
|
*/
|
||||||
|
public function __construct ($duration = 0) {
|
||||||
|
$this->duration = abs($duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert duration to string
|
||||||
|
*
|
||||||
|
* @return string The duration, as string
|
||||||
|
*/
|
||||||
|
public function __toString () {
|
||||||
|
return $this->getDays()->asRelativeWhole() . ' '
|
||||||
|
. $this->getHours()->asRelativeWhole() . ':'
|
||||||
|
. $this->getMinutes()->asRelativeWhole() . ':'
|
||||||
|
. $this->getSeconds()->asRelativeWhole() . '.'
|
||||||
|
. $this->getMilliseconds()->asRelativeWhole()
|
||||||
|
. $this->getMicroseconds()->asRelativeWhole();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Convert duration to user friendly string
|
||||||
|
*
|
||||||
|
* @return string The duration, as user friendly string
|
||||||
|
*/
|
||||||
|
public function toUserString () {
|
||||||
|
$parts = array(
|
||||||
|
$this->getDays()->asRelativeWhole() > 0 ? $this->getDays()->asRelativeWhole() . ' days' : '',
|
||||||
|
$this->getHours()->asRelativeWhole() > 0 ? $this->getHours()->asRelativeWhole() . ' hours' : '',
|
||||||
|
$this->getMinutes()->asRelativeWhole() > 0 ? $this->getMinutes()->asRelativeWhole() . ' minutes' : '',
|
||||||
|
$this->getSeconds()->asRelativeWhole() > 0 ? $this->getSeconds()->asRelativeWhole() . ' seconds' : '',
|
||||||
|
$this->getMilliseconds()->asRelativeWhole() > 0 ? $this->getMilliseconds()->asRelativeWhole() . ' milliseconds' : '',
|
||||||
|
);
|
||||||
|
|
||||||
|
$parts = array_filter(
|
||||||
|
$parts,
|
||||||
|
function ($part) {
|
||||||
|
return $part != '';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
$last = array_pop($parts);
|
||||||
|
|
||||||
|
return (count($parts) > 0 ? implode(' ', $parts) . ' and ' : '') . $last;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base time duration
|
||||||
|
*
|
||||||
|
* @return float The base time duration
|
||||||
|
*/
|
||||||
|
public function getDuration () {
|
||||||
|
return $this->duration;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Contains a time duration ? (more than 0 microseconds)
|
||||||
|
*
|
||||||
|
* @return bool True if contains a time duration
|
||||||
|
*/
|
||||||
|
public function hasTime () {
|
||||||
|
return abs($this->duration - 0) > self::EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time in microseconds
|
||||||
|
*
|
||||||
|
* @return DurationUnit The time in microseconds
|
||||||
|
*/
|
||||||
|
public function getMicroseconds () {
|
||||||
|
return new DurationUnit($this->duration * 1000000, DurationUnit::UNIT_MICROSECONDS); // 1000 milliseconds * 1000 microseconds
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The time in milliseconds
|
||||||
|
*
|
||||||
|
* @return DurationUnit The time in milliseconds
|
||||||
|
*/
|
||||||
|
public function getMilliseconds () {
|
||||||
|
return new DurationUnit($this->duration * 1000, DurationUnit::UNIT_MILLISECONDS); // 1000 milliseconds
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The time in seconds
|
||||||
|
*
|
||||||
|
* @return DurationUnit The time in seconds
|
||||||
|
*/
|
||||||
|
public function getSeconds () {
|
||||||
|
return new DurationUnit($this->duration, DurationUnit::UNIT_SECONDS);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The time in seconds
|
||||||
|
*
|
||||||
|
* @return DurationUnit The time in seconds
|
||||||
|
*/
|
||||||
|
public function getMinutes () {
|
||||||
|
return new DurationUnit($this->duration / 60, DurationUnit::UNIT_MINUTES); // 60 seconds
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The time in hours
|
||||||
|
*
|
||||||
|
* @return DurationUnit The time in hours
|
||||||
|
*/
|
||||||
|
public function getHours () {
|
||||||
|
return new DurationUnit($this->duration / 3600, DurationUnit::UNIT_HOURS); // 60 seconds * 60 minutes
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The time in days
|
||||||
|
*
|
||||||
|
* @return DurationUnit The time in days
|
||||||
|
*/
|
||||||
|
public function getDays() {
|
||||||
|
return new DurationUnit($this->duration / 86400, DurationUnit::UNIT_DAYS); // 60 seconds * 60 minutes * 24 hours
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace jrosset\ExecutionTimer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A time duration in a unit
|
||||||
|
*/
|
||||||
|
class DurationUnit {
|
||||||
|
const UNIT_MICROSECONDS = -2;
|
||||||
|
const UNIT_MILLISECONDS = -1;
|
||||||
|
const UNIT_SECONDS = 0;
|
||||||
|
const UNIT_MINUTES = 1;
|
||||||
|
const UNIT_HOURS = 2;
|
||||||
|
const UNIT_DAYS = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var float Time duration, in the unit
|
||||||
|
*/
|
||||||
|
private $duration;
|
||||||
|
/**
|
||||||
|
* @var int The time unit : self::UNIT_*
|
||||||
|
*/
|
||||||
|
private $unit;
|
||||||
|
/**
|
||||||
|
* @var int The maximum value of time unit (e.g. maximum of 60 secondes). 0 if no maximum (UNIT_DAYS)
|
||||||
|
*/
|
||||||
|
private $unit_max;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* New time duration
|
||||||
|
*
|
||||||
|
* @param float $time Time duration, in the unit
|
||||||
|
* @param int $unit The time unit : self::UNIT_*
|
||||||
|
*/
|
||||||
|
public function __construct ($time, $unit) {
|
||||||
|
$this->duration = $time;
|
||||||
|
$this->unit = $unit;
|
||||||
|
|
||||||
|
$units_max = array(
|
||||||
|
self::UNIT_MICROSECONDS => 1000,
|
||||||
|
self::UNIT_MILLISECONDS => 1000,
|
||||||
|
self::UNIT_SECONDS => 60,
|
||||||
|
self::UNIT_MINUTES => 60,
|
||||||
|
self::UNIT_HOURS => 24,
|
||||||
|
self::UNIT_DAYS => 0,
|
||||||
|
);
|
||||||
|
$this->unit_max = $units_max[$unit];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum value of time unit
|
||||||
|
*
|
||||||
|
* E.g. maximum of 60 secondes<br>
|
||||||
|
* 0 if no maximum (UNIT_DAYS)
|
||||||
|
*
|
||||||
|
* @return int The maximum value of time unit
|
||||||
|
*/
|
||||||
|
public function getUnit () {
|
||||||
|
return $this->unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get absolute time, with fractional
|
||||||
|
*
|
||||||
|
* @return float The absolute time, with fractional
|
||||||
|
*/
|
||||||
|
public function asAbsoluteFactional () {
|
||||||
|
return $this->duration;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get absolute time, without fractional
|
||||||
|
*
|
||||||
|
* @return int The absolute time, without fractional
|
||||||
|
*/
|
||||||
|
public function asAbsoluteWhole () {
|
||||||
|
return (int)floor($this->asAbsoluteFactional());
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get relative time (to upper unit), with fractional
|
||||||
|
*
|
||||||
|
* @return float The relative time, with fractional
|
||||||
|
*/
|
||||||
|
public function asRelativeFactional () {
|
||||||
|
return $this->unit_max === 0 ? $this->asAbsoluteFactional() : $this->asAbsoluteFactional() % $this->unit_max;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get relative time (to upper unit), without fractional
|
||||||
|
*
|
||||||
|
* @return int The relative time, without fractional
|
||||||
|
*/
|
||||||
|
public function asRelativeWhole () {
|
||||||
|
return $this->unit_max === 0 ? $this->asAbsoluteWhole() : $this->asAbsoluteWhole() % $this->unit_max;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,171 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace jrosset\ExecutionTimer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time measurer
|
||||||
|
*
|
||||||
|
* The main class
|
||||||
|
*/
|
||||||
|
class ExecutionTimer {
|
||||||
|
/**
|
||||||
|
* @var float Initial start time, in fractional seconds
|
||||||
|
*/
|
||||||
|
private $timeStart;
|
||||||
|
/**
|
||||||
|
* @var float[] Stop time of steps, in fractional seconds
|
||||||
|
*/
|
||||||
|
private $timeSteps;
|
||||||
|
/**
|
||||||
|
* @var float Stop time, in fractional seconds
|
||||||
|
*/
|
||||||
|
private $timeStop;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* New time measurer
|
||||||
|
*
|
||||||
|
* @param bool $autostart Start time measurement ?
|
||||||
|
*/
|
||||||
|
public function __construct ($autostart = true) {
|
||||||
|
$this->timeStart = 0;
|
||||||
|
$this->timeSteps = array();
|
||||||
|
$this->timeStop = 0;
|
||||||
|
|
||||||
|
if ($autostart) {
|
||||||
|
$this->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Measure current time as seconds with fractions
|
||||||
|
*
|
||||||
|
* @return float The current time
|
||||||
|
*/
|
||||||
|
private function measureTime () {
|
||||||
|
return microtime(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start a new time measurement
|
||||||
|
*/
|
||||||
|
public function start () {
|
||||||
|
$this->timeStart = $this->measureTime();
|
||||||
|
$this->timeSteps = array();
|
||||||
|
$this->timeStop = 0;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Measure a new step
|
||||||
|
*
|
||||||
|
* @param string name The name of the step
|
||||||
|
*/
|
||||||
|
public function step ($name = '') {
|
||||||
|
$this->timeSteps[$name === '' ? count($this->timeSteps) + 1 : $name] = $this->measureTime();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Stop time measurement
|
||||||
|
*/
|
||||||
|
public function stop () {
|
||||||
|
$this->timeStop = $this->measureTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is time measured ?
|
||||||
|
*
|
||||||
|
* @return bool True if time is measured
|
||||||
|
*/
|
||||||
|
public function isStart () {
|
||||||
|
return $this->timeStop === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of steps measured
|
||||||
|
*
|
||||||
|
* @return int The number of steps measured
|
||||||
|
*/
|
||||||
|
public function nbSteps () {
|
||||||
|
return count($this->timeSteps);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Has at least one step measured ?
|
||||||
|
*
|
||||||
|
* @return bool True if a least on step measured
|
||||||
|
*/
|
||||||
|
public function hasSteps () {
|
||||||
|
return $this->nbSteps() > 0;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* List of steps durations
|
||||||
|
*
|
||||||
|
* Each step provide an array of {@see Duration} with two cells :
|
||||||
|
* # The duration relative to previous step or initial start time if first step
|
||||||
|
* # The duration (relative to initial start time)
|
||||||
|
*
|
||||||
|
* @return Duration[][] List of steps durations
|
||||||
|
*/
|
||||||
|
public function getStepsDuration () {
|
||||||
|
$steps = array();
|
||||||
|
if (!$this->hasSteps()) {
|
||||||
|
return $steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
$timePrevious = $this->timeStart;
|
||||||
|
foreach ($this->timeSteps as $stepName => $timeStep) {
|
||||||
|
$steps[$stepName] = array(new Duration($timeStep - $timePrevious), new Duration($timeStep - $this->timeStart));
|
||||||
|
$timePrevious = $timeStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The last step duration relative to previous step or initial start time if first step
|
||||||
|
*
|
||||||
|
* @return Duration The time duration
|
||||||
|
*/
|
||||||
|
public function getLastStepRelativeDuration () {
|
||||||
|
switch($this->nbSteps()) {
|
||||||
|
case 0:
|
||||||
|
return new Duration();
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return new Duration(reset($this->timeSteps) - $this->timeStart);
|
||||||
|
|
||||||
|
default:
|
||||||
|
$time = end($this->timeSteps);
|
||||||
|
return new Duration( $time- prev($this->timeSteps));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The last step duration (relative to initial start time)
|
||||||
|
*
|
||||||
|
* @return Duration The time duration
|
||||||
|
*/
|
||||||
|
public function getLastStepDuration () {
|
||||||
|
if($this->nbSteps() === 0) {
|
||||||
|
return new Duration();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Duration( end($this->timeSteps) - $this->timeStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The total duration relative to previous step or initial start time if first step
|
||||||
|
*
|
||||||
|
* @return Duration The time duration
|
||||||
|
*/
|
||||||
|
public function getRelativeDuration () {
|
||||||
|
if($this->nbSteps() === 0) {
|
||||||
|
return $this->getDuration();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Duration( $this->timeStop - end($this->timeSteps));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The total duration (relative to initial start time)
|
||||||
|
*
|
||||||
|
* @return Duration The time duration
|
||||||
|
*/
|
||||||
|
public function getDuration () {
|
||||||
|
return new Duration($this->timeStop - $this->timeStart);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue