loadtime functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sylvester vader

sylvester vader

30/08/2019 15:06:19
Quote Anchor link
haha hier ben ik weer

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
 
PHP hulp

PHP hulp

15/09/2019 17:02:29
 
- Ariën -
Beheerder

- Ariën -

30/08/2019 15:33:15
Quote Anchor link
Bouw het in een class?
 
Thomas van den Heuvel

Thomas van den Heuvel

30/08/2019 17:24:43
Quote Anchor link
Schrijf een Stopwatch class :).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
    }
}

?>

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
}

?>
 
Sylvester vader

sylvester vader

30/08/2019 20:06:10
Quote Anchor link
mooi class scriptje
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
 
Thomas van den Heuvel

Thomas van den Heuvel

30/08/2019 20:15:56
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

31/08/2019 09:32:38
Quote Anchor link
Het kan eenvoudiger met de servervariabele $_SERVER['REQUEST_TIME_FLOAT']: deze bevat een timestamp met de start van het request in microseconden. Elders in een script kun je daarmee de tot dan verstreken tijd berekenen met:

microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']
 
Rob Doemaarwat

Rob Doemaarwat

31/08/2019 10:13:45
Quote Anchor link
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.
 
Sylvester vader

sylvester vader

31/08/2019 10:17:58
Quote Anchor link
lol ja dom eigenijk had ik ook kunnen doen
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
 
Thomas van den Heuvel

Thomas van den Heuvel

31/08/2019 14:32:42
Quote Anchor link
In absolute zin zijn queries sowieso "dure" operaties qua tijd, resources et cetera. Dus grote kans dat als je site traag is dat het aan je queries ligt. Tenzij je on-the-fly allemaal zware berekeningen aan het doen bent in PHP of dingen aan het doen bent met je filesysteem (bestanden en directories uitlezen ofzo). Maar "normale" webpagina's bevatten doorgaans enkel textsnippets die weergegeven worden, die staan opgeslagen in de database.

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
 
Rob Doemaarwat

Rob Doemaarwat

31/08/2019 15:57:12
Quote Anchor link
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).
 
Sylvester vader

sylvester vader

31/08/2019 17:22:33
Quote Anchor link
ja caching dat doe ik zoizo indien het kan

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.