Wpisany przez Patryk yarpo Jar
|
sobota, 26 września 2009 15:05 |
Zawsze warto wiedzieć jakie rozwiązanie w danych okolicznościach jest szybsze. Można za każdym razem odczytywać czas z początku i z końca, potem odejmować... Ale czy to nie jest nudne i żmudne?
A może by tak raz napisać porządnie klasę, a potem się już tylko lenić:
// autor Patryk yarpo Jar, klasa Profiler pozwala na mierzenie czasu wykonania skryptu
class Profiler {
private $start = false;
private $stop = false;
private $duration = false;
public function __construct() {
$this->start = $this->getCurrentTime();
}
private function getCurrentTime() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
private function measureDuration() {
if (false != $this->stop or false != $this->start) {
$this->duration = $this->stop - $this->start;
return $this->duration;
}
return false;
}
public function start() {
$this->stop = false; // skoro zaczelismy, to popredni stop jest niewazny
$this->duration = false; // nie wiemy kiedy konie, wiec skad mamy znac dlugosc?
$this->start = $this->getCurrentTime(); // aktualny czas
return $this->start;
}
public function stop() {
$this->stop = $this->getCurrentTime();
return $this->measureDuration();
}
public function getStartTime() {
return $this->start;
}
public function getStopTime() {
return $this->stop;
}
public function getTime() {
// jeszcze nie obliczono trwania
if (false === $this->duration) {
return $this->stop();
}
return $this->duration;
}
}
Jak z tego korzystać? Bardzo prosto:
$time = new Profiler();
for($i=0; $i<10000000; $i++) {
$tmp = array();
}
echo 'taka pętla trwała: ' . $time->stop();
Oczywiście można potem ten sam obiekt wykorzystać jeszcze kilka razy. Do tego służą metody Profiler::start() oraz Profiler::stop(). Dodatkowo można odczytać czas początku, końca oraz trwania osobno. Wedle upoobania.
|