Mierzenie czasu wykonania skryptu PHP - własna klasa Drukuj
Ocena użytkowników: / 0
SłabyŚwietny 
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.