loadtime functie
uhm ik heb in een eerdere topic iets gevraagt over queries tellen
nou wil ik daar eigelijk ook een loadtime iets bij hebben
nou ben ik dus een noob als het gaat om functies dus!!!
ik zoek een functie die de loadtime van de plek laat zien waar ik dit opvraag
dus als ik het ergens neerzet zegt het bv 0,0030
als ik het dan nogmaals 5 regels lager zet met wat code erin dan staat er bv 0,0035
enz enz
ik heb nu even als test zonder functie
$starttime = microtime(true); (aan het begin van de main page)
en dan
$tussentijd1 = microtime(true);
$total_time1 = round(($tussentijd1 - $starttime), 4); op een plekje en dan
echo $total_time1;
$tussentijd2 = microtime(true);
$total_time2 = round(($tussentijd2 - $starttime), 4);
echo $total_time2;
maar dit is dus best veel code aangezien ik dit dus op veel meer plekken wilt hebben
Bouw het in een class?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
class Stopwatch {
protected $timers;
public function __construct() {
$this->timers = array(
// structure example
/*
'default' => array(
'start' => 0,
'total' => 0,
'running' => false,
),
*/
);
}
public function start($name='default') {
if (isset($this->timers[$name])) {
// existing timer
if ($this->timers[$name]['running']) {
throw new Exception('Stopwatch: timer '.$name.' already running');
}
} else {
// new timer
$this->timers[$name] = array('total' => 0);
}
$this->timers[$name]['start'] = $this->getTime();
$this->timers[$name]['running'] = true;
}
public function stop($name='default') {
if (isset($this->timers[$name])) {
if ($this->timers[$name]['running'] === false) {
throw new Exception('Stopwatch: cannot stop timer '.$name.', it is not running');
}
$this->timers[$name]['total'] += ($this->getTime() - $this->timers[$name]['start']);
$this->timers[$name]['running'] = false;
} else {
throw new Exception('Stopwatch: cannot stop nonexisting timer '.$name);
}
}
// @todo add custom parameter for format, for now just return number of seconds with 3 decimals
public function getTotalTime($name='default') {
if (isset($this->timers[$name])) {
// we could also mark this as an error, but for convenience sake we allow this
if ($this->timers[$name]['running']) {
// stop timer
$this->stop($name);
}
return number_format($this->timers[$name]['total'], 3);
} else {
throw new Exception('Stopwatch: cannot retrieve total time from nonexisting timer '.$name);
}
}
protected function getTime() {
return microtime(true);
}
}
?>
class Stopwatch {
protected $timers;
public function __construct() {
$this->timers = array(
// structure example
/*
'default' => array(
'start' => 0,
'total' => 0,
'running' => false,
),
*/
);
}
public function start($name='default') {
if (isset($this->timers[$name])) {
// existing timer
if ($this->timers[$name]['running']) {
throw new Exception('Stopwatch: timer '.$name.' already running');
}
} else {
// new timer
$this->timers[$name] = array('total' => 0);
}
$this->timers[$name]['start'] = $this->getTime();
$this->timers[$name]['running'] = true;
}
public function stop($name='default') {
if (isset($this->timers[$name])) {
if ($this->timers[$name]['running'] === false) {
throw new Exception('Stopwatch: cannot stop timer '.$name.', it is not running');
}
$this->timers[$name]['total'] += ($this->getTime() - $this->timers[$name]['start']);
$this->timers[$name]['running'] = false;
} else {
throw new Exception('Stopwatch: cannot stop nonexisting timer '.$name);
}
}
// @todo add custom parameter for format, for now just return number of seconds with 3 decimals
public function getTotalTime($name='default') {
if (isset($this->timers[$name])) {
// we could also mark this as an error, but for convenience sake we allow this
if ($this->timers[$name]['running']) {
// stop timer
$this->stop($name);
}
return number_format($this->timers[$name]['total'], 3);
} else {
throw new Exception('Stopwatch: cannot retrieve total time from nonexisting timer '.$name);
}
}
protected function getTime() {
return microtime(true);
}
}
?>
Het bovenstaande kan verschillende timers al dan niet tegelijkertijd laten lopen en je kunt timers ook onderweg stoppen en weer starten, zo zou je dus de tijd voor queries bij elkaar kunnen sprokkelen en afgescheiden houden van andere laadtijden.
Voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
try {
$timer = new Stopwatch();
$timer->start('total');
// query time
$timer->start('queries');
$b = array();
for ($i=0; $i < 100000; $i++) {
$b[] = 'hello';
}
$timer->stop('queries');
// code crunching
$a = array();
for ($i=0; $i < 10000; $i++) {
$a[] = 'hello';
}
// query time
$timer->start('queries');
$c = array();
for ($i=0; $i < 50000; $i++) {
$c[] = 'hello';
}
$timer->stop('queries');
// totals
echo 'queries: '.$timer->getTotalTime('queries').'s, total: '.$timer->getTotalTime('total').'s';
} catch (Exception $e) {
echo $e->getMessage();
}
?>
try {
$timer = new Stopwatch();
$timer->start('total');
// query time
$timer->start('queries');
$b = array();
for ($i=0; $i < 100000; $i++) {
$b[] = 'hello';
}
$timer->stop('queries');
// code crunching
$a = array();
for ($i=0; $i < 10000; $i++) {
$a[] = 'hello';
}
// query time
$timer->start('queries');
$c = array();
for ($i=0; $i < 50000; $i++) {
$c[] = 'hello';
}
$timer->stop('queries');
// totals
echo 'queries: '.$timer->getTotalTime('queries').'s, total: '.$timer->getTotalTime('total').'s';
} catch (Exception $e) {
echo $e->getMessage();
}
?>
ik heb hem ff onder die andere class van mij gezet en hij werkt opzich wel goed
als ik bij elke deel waar ik tijd van wilt weten
$timer = new Stopwatch(); neerzet
en dan aan begin
$timer->start('queries');
en aan het eind
$timer->stop('queries');
echter die total werkt niet
moet ik daar dan ook een stop neerzetten? ofzo of doe ik dan iets fout
Je moet overal één en hetzelfde object gebruiken, dus $timer zul je op een of andere manier door moeten geven zodat dit object (met hierin alle tijden) overal beschikbaar is.
microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']
Ligt er aan *wat* je wilt meten. Meestal boeit het niet zo hoe lang je al bezig bent (en vaak zit tussen $_SERVER['REQUEST_TIME_FLOAT'] en de eerste regel van je script al een paar ms omdat Apache en PHP ook hun ding moeten doen), maar meer hoe lang een bepaalde aktie (stap) duurt. Vervolgens zie je dan de meeste tijd gespendeerd wordt in stap 12 (van de 34). Daar kun je dan je focus op leggen.
maar ik heb hem werkend nu denk ik
ik heb nu ff als test een paar gemaakt met gewoon een start en een stop bij elk deel die ik wil meten
en dan onder een andere naam ook een start aan begin en helemaal aan het einde van de page
en dit werkt wel redelijk goed
ik denk dat ik zo er wel uitkom
ik zie al gelijk delen die ik wil aanpassen :P
ik heb nu bv ondekt dat ik bij 1 klant als er in princiepe niks is geladen een loadtime heb van Uitgevoerde queries: 17 , loadtime: 0.306s
maar bij een andere klant met dezelfde settings
Uitgevoerde queries: 17 , loadtime: 0.005s
dat scheeld nogal dus ff kijken wat de reden hiervan is
ook ben ik er nu achter dat hij wel 35 queries laad per invoer in mijn touchscreen/pos systeem
dat moet ik volgens mij kunnen halveren
80% in dat deel code is met while gedaan
Toevoeging op 31/08/2019 12:03:27:
ff een paar indexen erbij gezet die 0.306s is nu 0.066s
Het is altijd goed om het aantal queries terug te dringen, maar daarbij moet je ook kijken naar de efficiëntie van de individuele queries. Het kan dus handig zijn om queries te loggen en te analyseren (met EXPLAIN of de slow query log, zie andere thread). Als je begint met je traagste query kun je vaak (heel) veel winst pakken.
Indien je traagste query "snel genoeg" is zou ik nog steeds kijken of je hier iets vanaf kunt schaven. Dit geeft je ook inzicht hoe je in het vervolg je database beter zou kunnen structureren en hoe je hier efficiënt queries op uit kunt voeren. Dit niet doen omdat het "snel genoeg" is is gewoon zonde.
En dan dus nog de realisatie dat er tijdens de executietijd resources bezet worden. Dat zorgt voor een sneeuwbaleffect op het moment dat je site drukker bezocht gaat worden en dan kan deze heel snel trager worden :). Dit komt omdat de periodes waarin er overlap is in het resourcegebruik toenemen op het moment dat meerdere mensen tegelijkertijd pagina's opvragen.
Realiseer je je dus ook goed dat wat je tot nu toe hebt gedaan het op enig moment simpelweg inspecteren van één enkele gebruiker was, het effect van "meerdere gebruikers tegelijkertijd" is een heel ander spel waarbij resourcelimieten veel belangrijker worden.
Iets wat men volgens mij ook vaak vergeet is het simpelweg tussendoor vrijgeven van resultaten want vaak worden resources onnodig vastgehouden tot het einde van het request / de code, terwijl je allang klaar bent met het doorlopen van een resultset. Als dit om een of andere manier wat forsere queries zijn dan werkt dat het eerdergenoende sneeuwbaleffect-gevaar in de hand. Ben je klaar met een queryresultaat, geef deze dan vrij.
Ook zou je eens via phpinfo() kunnen kijken welke driver (client API) MySQL gebruikt. MySQL raadt zelf de MySQL native driver (mysqlnd) aan in combinatie met de MySQLi of PDO_MYSQL extensie. Er waren dacht ik een aantal voordelen bij het gebruik van de native driver ten opzichte van de standaard client library (libmysql), o.a. op het moment dat je ook gaat kijken naar geheugengebruik van zowel PHP alsook MySQL, de native driver werkt dan wat intuïtiever.
Gewijzigd op 31/08/2019 14:45:02 door Thomas van den Heuvel
En: "cache = king". Als je voor elke pagina steeds dezelfde queries doet (om bijvoorbeeld stukjes tekst op te halen), dan zou je die tijdelijk kunnen cachen (beter: het hele resultaat van een aantal queries, bijvoorbeeld je hele template). Je kunt dat globaal doen, maar evt. ook per gebruiker (als er gebruikersafhankelijke delen in zitten).
ik heb een heel uitgebreid boekhoud systeem gemaakt binnen in mijn online software
mijn script maakt van elke dag en per mederwerker een cache bestand aan met all voor uitgerekende variabelen
heel vroeger had ik dit niet toen duurde het laden soms wel 5 min
tegenwoordig max 5 sec