Benchmarks van mijn framework (1)
Na nog wat uurtjes besteed te hebben aan mijn framework vond ik het wel tijd om eens met wat benchmarks te komen. Ik beloof immers flitsende prestaties, en dat moet ik wel kunnen onderbouwen. 
Omdat ik de laatste tijd veel werk aan mijn image manipulatie classes heb besteed besloot ik om een kleine variatie op mijn avatar te maken. Namelijk een afbeelding van 60x60 pixels, met een random achtergrond kleur en de tekst van de datum en tijd ook in willekeurige kleuren.
Normaal gesproken zou dat, zonder mijn framework, op de volgende code uitkomen.
PHP:
Bij gebruik van mijn framework heb ik daar de volgende code voor nodig (met wat commentaar):
PHP:
Lijkt me prima te begrijpen, toch? Uit beide scriptjes komt hetzelfde resultaat, bijvoorbeeld:

Qua benchmarks ben ik een beetje gehandicapt dit keer. Ik heb alleen mijn laptop met een nogal brakke Ubuntu 7.10 installatie tot mijn beschikking. Daar heb ik door middel van Apt Apache 2.2.4 en PHP 5.2.3 op geïnstalleerd. Ook draait de client op de laptop waardoor de testomgeving op z'n zachts gezegd sub-optimaal is. Het benchen is gebeurd door middel van ApacheBench, met de het volgende commando:
Hiermee wordt ApacheBench uitgevoerd met 5 gelijktijdige requests, en een totaal van 1000 requests.
In het bestand icon.php staat de code die gebruik maakt van mijn framework, en icon2.php bevat de klassieke benadering. De test is 3x per bestand uitgevoerd, door in een simpel shellscriptje 3 maal het bovenstaande commando op te nemen. De resultaten zijn het gemiddelde uit deze 3 metingen.
Is icon2.php sneller? Ja, zonder twijfel. In dit geval zelfs bijna 2x zo snel. Maar volgens mijn bescheiden mening is een performance hit nooit te voorkomen, als je meer functionaliteit toevoegt. Zo wordt binnen die 7.7 ms mijn framework geladen en gestart waarbij onder andere de aleerder beschreven namespace cache opgebouwd word die in dit geval uit 7 namespaces bestaat. Ook wordt de atlex_nl_image namespace geladen, wat weer meer disk I/O geeft.
Om de invloed van de harde schijf te meten heb ik 1 regel code toegevoegd aan icon2.php op regel 3, dus direct onder error_reporting(), die mijn framework include.
PHP:
Let wel, dit include alleen mijn framework maar maakt er nog geen instantie van aan.!
De resultaten zijn dan ineens heel anders, de gemiddelde tijd over 3 runs van 1000 requests per stuk komt dan uit op 6.328 miliseconden. Het verschil is dan ineens nog maar 1.277 ms. tegenover 3.679 ms. zonder dat ene include() regeltje. Voegt mijn framework dus wat overhead toe? Ja, daarover valt niet te discussiëren. Is het minimaal en weegt het dus niet op tegen de voordelen? Ja, wat mij betreft wel.
Voor de oplettende lezer is nu ook meteen de naam van mijn framework bekend, voor de minder oplettende bezoeker: Colonna. Colonna betekent pilaar of zuil in het Italiaans, wat ik wel een mooie naam vond voor iets dat als steunpilaar onder een applicatie staat.
Omdat ik de laatste tijd veel werk aan mijn image manipulatie classes heb besteed besloot ik om een kleine variatie op mijn avatar te maken. Namelijk een afbeelding van 60x60 pixels, met een random achtergrond kleur en de tekst van de datum en tijd ook in willekeurige kleuren.
Normaal gesproken zou dat, zonder mijn framework, op de volgende code uitkomen.
PHP:
1 | <?php
|
Bij gebruik van mijn framework heb ik daar de volgende code voor nodig (met wat commentaar):
PHP:
1 | <?php
|
Lijkt me prima te begrijpen, toch? Uit beide scriptjes komt hetzelfde resultaat, bijvoorbeeld:

Qua benchmarks ben ik een beetje gehandicapt dit keer. Ik heb alleen mijn laptop met een nogal brakke Ubuntu 7.10 installatie tot mijn beschikking. Daar heb ik door middel van Apt Apache 2.2.4 en PHP 5.2.3 op geïnstalleerd. Ook draait de client op de laptop waardoor de testomgeving op z'n zachts gezegd sub-optimaal is. Het benchen is gebeurd door middel van ApacheBench, met de het volgende commando:
akamsteeg@klapjap:~$ ab -c 5 -n 1000 http://localhost/akamsteeg/colonna/icon.php
Hiermee wordt ApacheBench uitgevoerd met 5 gelijktijdige requests, en een totaal van 1000 requests.
In het bestand icon.php staat de code die gebruik maakt van mijn framework, en icon2.php bevat de klassieke benadering. De test is 3x per bestand uitgevoerd, door in een simpel shellscriptje 3 maal het bovenstaande commando op te nemen. De resultaten zijn het gemiddelde uit deze 3 metingen.
| Icon.php | Icon2.php |
| 7.605 ms | 3.926 |
Is icon2.php sneller? Ja, zonder twijfel. In dit geval zelfs bijna 2x zo snel. Maar volgens mijn bescheiden mening is een performance hit nooit te voorkomen, als je meer functionaliteit toevoegt. Zo wordt binnen die 7.7 ms mijn framework geladen en gestart waarbij onder andere de aleerder beschreven namespace cache opgebouwd word die in dit geval uit 7 namespaces bestaat. Ook wordt de atlex_nl_image namespace geladen, wat weer meer disk I/O geeft.
Om de invloed van de harde schijf te meten heb ik 1 regel code toegevoegd aan icon2.php op regel 3, dus direct onder error_reporting(), die mijn framework include.
PHP:
| <?php
|
Let wel, dit include alleen mijn framework maar maakt er nog geen instantie van aan.!
De resultaten zijn dan ineens heel anders, de gemiddelde tijd over 3 runs van 1000 requests per stuk komt dan uit op 6.328 miliseconden. Het verschil is dan ineens nog maar 1.277 ms. tegenover 3.679 ms. zonder dat ene include() regeltje. Voegt mijn framework dus wat overhead toe? Ja, daarover valt niet te discussiëren. Is het minimaal en weegt het dus niet op tegen de voordelen? Ja, wat mij betreft wel.
Voor de oplettende lezer is nu ook meteen de naam van mijn framework bekend, voor de minder oplettende bezoeker: Colonna. Colonna betekent pilaar of zuil in het Italiaans, wat ik wel een mooie naam vond voor iets dat als steunpilaar onder een applicatie staat.
|
|
Gelukkig nieuwjaar |
|
|
Type hinting in PHP |
Reacties
En dan nu de hoofdvraag: maak je dit framework opensource? 
Zo, handig zo'n framework.... 6 extra regels code, 2x zo traag, code die niet iedere PHP'er snapt.... Kun je geen representatieve demo maken of is je framework echt alleen een uit de hand gelopen wrapper om PHP heen? 
@Hacku: dat is wel de bedoeling, uiteindelijk.
Een roadmap of zelfs een bij benadering te noemen datum voor de eerste release is er niet.
@MikeN: tof dat je ook even leest waarom mijn framework trager is.
Volgens mij ben je na de eerste resultaten al gestopt met lezen om je flame neer te zetten. En nee, het is geen wrapper. Het voegt daadwerkelijk functionaliteit toe, en maakt het programmeren van een aantal zaken behoorlijk makkelijker.
Mijn idee met deze kleine benchmarks is elke keer een klein gedeelte van mijn framework testen, en meteen kleine blikken op de geboden functionaliteit bieden. Is dat representatief? Weet ik niet. Is het als uitgebreide demo bedoeld? Nee, zeker niet.
Als ik deze week nog tijd heb zal ik proberen om met een aantal bestaande open-source PHP frameworks een pagina in elkaar te draaien die overal hetzelfde moet doen. Die kan ik dan benchen om een kleine vergelijking te maken. Zelf dacht ik aan het namaken van mijn avatar, zoals ik 'm nu op GoT gebruik. Deze bevat namelijk behoorlijk wat SQL voor de stats erachter, een beetje disk I/O voor de caching en het inlezen van de background image en image manipulation. Voor een beetje framework moet dat allemaal geen probleem zijn.
@MikeN: tof dat je ook even leest waarom mijn framework trager is.
Mijn idee met deze kleine benchmarks is elke keer een klein gedeelte van mijn framework testen, en meteen kleine blikken op de geboden functionaliteit bieden. Is dat representatief? Weet ik niet. Is het als uitgebreide demo bedoeld? Nee, zeker niet.
Als ik deze week nog tijd heb zal ik proberen om met een aantal bestaande open-source PHP frameworks een pagina in elkaar te draaien die overal hetzelfde moet doen. Die kan ik dan benchen om een kleine vergelijking te maken. Zelf dacht ik aan het namaken van mijn avatar, zoals ik 'm nu op GoT gebruik. Deze bevat namelijk behoorlijk wat SQL voor de stats erachter, een beetje disk I/O voor de caching en het inlezen van de background image en image manipulation. Voor een beetje framework moet dat allemaal geen probleem zijn.
Het is geen punt als een framework trager is, de rekentijd is vaak veel minder relevant dan de tijd dat het kost om iets te coden. Dat is ook waar frameworks voornamelijk voor bedoeld zijn: sneller kunnen coden. Als jij dan hier een stuk code neerzet waarbij iedere regel eigenlijk gewoon zo ongeveer hetzelfde doet als een regel PHP, en dus slechts de syntax anders is, blijkt daaruit niet echt het nut van je framework. Het enige verschil zit hem in de namespaces. Dat is leuk, maar volgens mij niet een killer feature waarvoor meteen een heel apart framework nodig zou zijn. Het zou dus leuk zijn als je juist kan laten zien hoe je framework echt verschil kan maken 
Het voorbeeld was misschien een beetje slecht, omdat je voor de dingen die ik wilde doen nu eenmaal een bepaald aantal acties nodig hebt.
Je kan immers geen nieuwe afbeelding maken zonder de afmetingen op te geven, en een stukje tekst erop plaatsen zonder de coördinaten is ook niet echt handig.
Misschien moet je deze demo dan ook meer zien als een showcase van Object Orientated Image Manipulation in PHP™. 