Benchmark and optimize PHP script speed

Ik heb inmiddels kunnen ondervinden waarom snelheidsoptimalisering in PHP heel belangrijk is. Mijn werk is onderandere het ontwikkelen van een zeer complex digitaal leersysteem (Mind2Mind) en dit product heeft een tijdje geleden voor het eerst zijn "vuurdoop" gehad. Na verloop van tijd groede het aantal gebruikers in het systeem naar 3000 en het aantal gebruikergroepen naar 8000. Toen dit gebeurde kwamen we er achter dat het systeem niet goed om kon gaan met grote hoeveelheden data.

Daardoor heb ik geleerd dat het erg belangrijk is om in het begin van een project (al is het een simpele website) al een aantal "best practices" toe te passen om de snelheid van een script te verhogen.

Benchmark

In mijn ervaring is het vaak het lastigste om in een bestaand script te pin pointen waar exact de vertraging zit. In mijn geval dacht ik dat het ergens achter in de pagina zat bij het opbouwen van de paginering, maar het bleek later al helemaal voor in de pagina te zitten, bij het instantieren van de classes.

Een optie is om alles in een pagina uit te commentariseren (wegcommenten, of hoe je het ook wil noemen) en een voor een regels weer zichtbaar te maken. Op het moment dat de pagina weer traag word weet je dat het probleem zit in de regel die je net weer "aan hebt gezet".

Maar soms is dit niet voldoende (in mijn geval iig niet) en wil je soms precies weten hoe lang een functie ergens over doet. Ik ga dan meestal als volgt te werk; als eerste "time" ik hoe lang de volledige pagina duurt om uitgevoerd te worden. Als tweede deel ik de pagina op in stukken en "time" ik deze. Als dit nog niet voldoende is plaats ik om elke functie die uitgevoerd word een timer, zodat ik precies kan zien hoe lang iets duurt.

Dit doe ik met het volgende script:
PHP
  1. function getTime() {
  2.     $timer = explode( ' ', microtime() );
  3.     $timer = $timer[1] + $timer[0];
  4.     return $timer;
  5. }

En in een stuk voorbeeldcode gebruik ik dit als volgt:
PHP
  1. $start = getTime();
  2.     $aUsers = $wms->getUsers( 0, $showType, true, ($_REQUEST['page']*$perPage), $perPage );
  3. $end = getTime();
  4. echo  '<strong>getUsers/getUsersByAbc</strong>: '.round($end - $start,4).' seconden<br />';

In regel 1 word het starttijdstip opgeslagen in de variabele $start. In regel 2 word de functie uitgevoerd en in regel 3 word het eindtijdstip opgeslagen in $end. Als laatste word dan in regel 4 een string weergegeven waarin het aantal seconden staat (afgerond op 4 cijfers achter de comma).

Optimaliseren
Nu je gevonden hebt waarin de traagheid zit kun je deze "best practices" toepassen:

  • Gebruik static methods als dit mogelijk is, dit is 4 maal sneller
  • Echo is sneller dan print
  • Gebruik , inplaats van . om strings aan elkaar te plakken
  • Zet de maximale waarde in een for-loop voor de loop, niet in de for statement.
  • $max = count($array);
    for ($i=0;$i<$max;$i++) {
    echo $i;
    }
  • Unset variabelen om geheugen vrij te maken (vooral bij hele grote arrays)
  • Gebruik volledige paden in includes en requires, dan hoeft de server niet de paden uit te zoeken
  • Gebruik strncasecmp, strpbrk en stripos in plaats van regex
  • Het is beter om een select statement te gebruiken dan if statements met meerdere else statements
  • Errors onderdrukken met @ is erg langzaam
  • Sluit database connecties als je ze niet meer nodig hebt
  • $row['id'] is 7 keer sneller dan $row[id]
  • Een globale variabele optellen is 2 keer langzamer dan een lokale variabele
  • Je strings omvatten met enkele quotes (') in plaats van dubbele quotes (") is sneller omdat PHP zoekt naar variabelen binnen "..." en niet binnen '..'
  • Een PHP script is zondermeer 2 tot 10 keer langzamer dan een HTML pagina, dus als gebruik PHP alleen als het nodig is.
  • PHP scripts worden elke keer als ze aangeroepen worden opnieuw "gecompiled". Gebruik PHP caching software om een gemiddelde snelheidsverbetering van 25% tot 100% te behalen.
  • $i++ is langzamer dan ++$i
  • Niet alles hoeft OOP te zijn. Vaak is OOP alleen maar overhead, dus gebruik het verstandig!
  • Gebruik zoveel mogelijk van de standaard functies in PHP, je hoeft niet zelf het wiel uit te vinden


Deze lijst met optimalisaties heb ik gevonden op internet en uitgeprint, maar kan helaas de bron niet meer vinden. Als iemand de orginele pagina weet, dan zou ik deze hier graag willen vermelden!

Comments

Name: moppenpagina.be (10 July 2008 - 22:01)
Dit is waarschijnlijk de originele pagina die je zoekt:

http://reinholdweber.com/?p=3

Uw optimalisatietips komen perfect overeen met vermelde
pagina, alleen worden aldaar 40 tips vermeld.

Post a comment

Name:

Comment:

Are you a real person or a spambot?

Copy the text above in the field below: