2016-08-11 4 views
0

Ich versuche OOP zu verstehen und machte meine eigene Klasse eine MySQL-DBZeit zwischen den Funktionen in der Klasse messen? Das Ergebnis ist dieses

class Benchmark 
{ 

    protected $sql, $db; 
    public $result, $time; 

    public function __construct($host, $user, $pass, $db, $result = array(), $time = null) 
    { 

     /* Vars */ 
     $this->db = $db; 
     $this->result = $result; 
     $this->time = $time; 

     /*Start Timer */ 
     $this->time = microtime(true); 

     /* Connect to DB */ 
     $this->sql = new \mysqli($host, $user, $pass); 

     /* Measure Time and put result to array */ 
     $this->result['benchmark']['connect'] = $this->elapsedTime($this->time); 


    } 

    public function testMySQL() 
    { 

     /* Connect to DB */ 
     $this->sql->select_db($this->db); 
     $this->result['benchmark']['selectDb'] = $this->elapsedTime($this->time); 

     /* Fetch Version */ 
     $version = $this->sql->server_version; 
     $this->result['benchmark']['version'] = $this->elapsedTime($this->time); 
     $this->result['info']['version'] = $version; 

     /* Benchmark */ 
     $this->sql->query('SELECT BENCHMARK(1000000,ENCODE("hello",RAND()));'); 
     $this->result['benchmark']['result'] = $this->elapsedTime($this->time); 

     /* Close Connection */ 
     $this->sql->close(); 

     /* Total Time */ 
     $this->result['info']['total'] = $this->elapsedTime($this->time); 

     $this->dump($this->result); 

    } 
} 

jedoch zum Benchmark:

Array 
(
[benchmark] => Array 
    (
     [connect] => 0.001 
     [selectDb] => 0.001 
     [version] => 0.001 
     [result] => 10.181 
    ) 

[info] => Array 
    (
     [version] => 50713 
     [total] => 10.181 
    ) 

) 

Warum tut die Zeit aufsummieren? Sollte in diesem Fall nicht [total]10.184 sein?

Die ursprüngliche Idee ist von hier: https://github.com/odan/benchmark-php und das funktioniert. Wenn ich dieselben Daten für dieses Skript verwende, addiert es sich, wo liege ich falsch? Ich denke, es hat etwas obwohl mit meinem Mangel an OOP zu tun ...

EDIT

public function elapsedTime($time) 
{ 
    return number_format(microtime(true) - $time, 3); 
} 
+2

Wo wird "elapsedTime" definiert? –

+0

Aktualisiert für Klarheit – PrimuS

Antwort

0

Wenn Sie die abgelaufene Zeit messen, da die Zeit gestartet wird, dann wird jeder Ausgang ist einfach ein Punkt in dieser Zeitperiode. Die Zeit von der Initialisierung des Timers bis zum Ergebnis ist nicht zusätzlich zu die Zeit, die es braucht, um zu verbinden, wählen Sie die db, und erhalten Sie die Version, das sind nur Checkpoints auf dem Weg (die scheinbar virtuell auftreten gleichzeitig, zumindest bei der Auflösung dieses Timers). So ist die Gesamtzeit 10.181, .001 von denen es dauerte, um die ersten drei Operationen durchzuführen, nicht .003.

+0

Ich sehe Ihren Standpunkt! Ich habe die "elapsedTime" -Funktion hinzugefügt. Das sollte kein Punkt sein, oder? – PrimuS

+0

Die Funktion gibt immer noch "now - then" aus, "then" ist dann, als der Konstruktor initialisiert wurde, also schaut man auf die Uhr, wenn diese Aufgaben erledigt sind, aber wenn der Minutenzeiger immer noch auf 1 steht, heißt das nicht drei Minuten sind vergangen, auch wenn Sie es dreimal sehen;). Dies ergibt jedoch einen logischen Sinn, da die drei Operationen: Verbinden, Auswählen, Holen der Version praktisch augenblicklich sind, verglichen mit dem Einreichen einer Abfrage und dem Erhalten des Ergebnisses. –

+0

Große Analogie mit der Uhr. Ich verstehe das Problem jetzt völlig! Vielen Dank – PrimuS

Verwandte Themen