@codenerd på twitter Mit seneste tweet:

PHP: Sidens loadtime – til debug og sjov

Mange sider viser sidens loadtime i bunden af skærmen, og dette er da en meget sjov lille ting, men for brugeren ikke voldsom brugbar, da der er tale om PHPs eksekveringstid.

For udvikleren er dette dog ganske interessant, da man altid kan måle og optimere sin kode ud fra hvor hurtigt den eksekveres. PHP har selvfølgelig en indbygget funktion til dette, php:microtime .

php:microtime returnerer som standard to numre adskilt af komma (fx 0.37577400 122175750957800), hvoraf det første er mikrosekunder, og det andet er hele sekunder siden 1 Januar 1970 kl. 0 : 00 : 00 (år 0 i computerregning). Hvis vi kalder denne funktion i toppen af vores side og i bunden og trækker disse to tal fra hinanden får vi altså den præcise eksekveringstid for vores PHP script.

PHP 4 og PHP 5 eksempler

Funktionen kan bruges forskelligt afhængigt af om man kører med PHP 5 eller 4. Hvis man sender true med som parameter, laver PHP 5 returværdien om til et gyldigt timestamp, og så kan vi udregne tiden således:

PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
    ##indsæt i toppen af dit dokument - henter nuværende tid
    $startTid = microtime(true);
    
    ## alt din kode her
    
    ##indsæt i bunden
    $slutTid=microtime(true);
    ##udskriv load tid
    echo 'Loadtid: '.($slutTid-$startTid).' sek.<br>';
?>

Dette er jo super nemt. Desværre skal man lige lave lidt krumspring når det gælder PHP 4, da denne ikke selv kan lave det gyldige timestamp. PHP manualen foreslår PHP 4 brugere bruger følgende funktion:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
    ##indsæt i toppen af dit dokument - henter nuværende tid
    $startTid = microtime_float();
    
    ## alt din kode her
    
    ##indsæt i bunden
    $slutTid=microtime_float();
    ##udskriv load tid
    echo 'Loadtid: '.($slutTid-$startTid).' sek.<br>';
?>

Hvor vi før kaldte php:microtime direkte, kalder vi nu vores egen funktion som omdanner outputtet fra microtime.

Bonus

En anden god ting at optimere kode ud fra er ram forbruget, og igen har PHP indbygget funktioner til dette, nemlig php:memory_get_usage, som giver det nuværende ram forbrug i bytes, og php:memory-get-peak-usage som giver antal bytes dit script max har brugt.

Når jeg optimerer kalder jeg gerne php:memory_get_usage i toppen og php:memory_get_peak_usage i bunden af mit script (se eksempel herunder) – sammen med sidens loadtid er disse tal et rigtigt godt sted at starte når det kommer til optimering.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    ##hent nuværende ram forbrug i bytes
    echo 'Ramforbrug: '. memory_get_usage().'<br>';
    ##indsæt i toppen af dit dokument - henter nuværende tid
    $startTid = microtime(true);
    
    ################
    ##din kode her##
    ################
    
    ##indsæt i bunden af dit dokument
    $slutTid=microtime(true);
    
    ## udskriv loadtid samt max ram forbrug
    echo 'Loadtid: '.($slutTid-$startTid).' sek.<br>Max Ramforbrug under eksekvering: '.memory_get_peak_usage();
?>

6 kommentarer

  1. Ja selvom det er utrolig simpel kode er det absolut noget man bør checke på alle sites, specielt når man arbejder på de lidt større sites.

    Der har været en del der har skrevet og spurgt om jeg ikke ville gennemgå nogle af de funktioner jeg ofte bruger, så selvom det måske ikke lige er rocket science så kommer der nok en del af den her slags i fremtiden.

    Svar på kommentaren
  2. Nu er det godt nok et lidt gammel tip, men det gælder jo stadig :)

    Kan man sige noget om hvornår man skal begynde at koncentrere sig om at optimere sin kode. Nu har jeg f.eks. lagt det ind på min side og forsiden tager f.eks. 0,00918 om at eksekvere. Men hvor “langsom” skal den være for at man skal begynde at kigge lidt nærmere på koden?

    Det afhænger selvfølgelig meget af hvilken side det er man har, altså hvor meget kode der skal afvikles, men alligevel :)

    Svar på kommentaren
  3. @Jacob ja det må man sige, altid relevant at optimere.

    Mht til hvornår der skal optimeres – så kommer det an på mange ting. En af de ting du kan evt prøve at lave en side hvor der er minimalt, altså lidt løkker, måske et kald til databasen osv, basis ting, dette tager du så en måling på – og så kan du bruge dette som din basis måling.

    Jeg vil dog ikke mene at du har grund til optimering når du ligger på loadtider som på forsiden, så det kunne nok sagtens være en god basismåling. Til sammenligning kan jeg da sige min ligger på 0.5 sekund, hvilket er i overkanten, da det jo kun er servertid, så kommer der loadtid i browser osv også.

    Svar på kommentaren

Skriv en kommentar

Krævede felter er markeret med *.

*