hoeveel classes
Ik ben een autoloader aan het maken en ik twijfel even (vanuit performance oogpunt) of ik een bepaald stukje intelligentie wel of niet zal inbouwen.
Om die reden ben ik benieuwd hoeveel classes (bestanden) er ongeveer worden ingeladen door de autoloader tijdens 1 request. Weet iemand daar een (globaal) antwoord op? Moet ik dan bijv. denken aan 50, 100, 500, 1000 of misschien wel meer dan 1000?
Let op, het gaat dus echt om het aantal bestanden (classes) dat moet worden ingeladen. Het gaan niet om het uiteindelijke aantal objecten.
Gewijzigd op 30/03/2013 14:43:37 door Ozzie PHP
In mijn optiek (niet dat ik zo'n OO guru ben) zou in een autoloader de dingen moeten staan die het ding kan laten werken. Dus denk in jou geval als we het over een framework hebben, dat enkel die bestanden geladen moeten worden om het basis systeem te starten.
Even vanuit gaande dat je iets hebt van een soort MVC dan zouden die bestanden op zijn plaats zijn in een autoloader.
Optionele zaken zou ik pas laden als je ze nodig hebt.
Denk bijvoorbeeld aan een database laag, hoeft niet perse een optie te zijn in je framework dus die sluit je uit.
Daarvoor zou ik een aparte optie maken die je kunt autoloaden.
Maar die zijn dan optioneel, en geen onderdeel van het basis systeem.
Ik begrijp je vraag over hoeveel bestanden dan ook niet zo.
Je laad iets omdat je het nodig hebt, niet meer of minder toch?
Als dat 50 classes zijn, dan twijfel ik een beetje of je een denkfout ergens maakt.
Wat bedoel je hiermee? Jij denkt dat het er meer zijn, of minder? Verklaar je nader...
Ik neem even voor het gemak codeigniter.
Deze heeft een berg library's, helpers e.d.
Als ik daar een applicatie mee maak, dan heb ik 2 opties:
Ik kan ze autoloaden, of ik kan ze gebruiken op het moment dat ik ze nodig heb.
Het zal in de praktijk nooit voorkomen dat ik bijvoorbeeld zo snel geteld alle 28 classes autoload.
Immers hoeft mijn applicatie (bijvoorbeeld in het onderdeel gastenboek) geen cart class of file upload class te hebben. Dus die heb ik niet nodig.
Wat heb ik dan wel nodig, bijvoorbeeld een database, en pagination bijvoorbeeld.
Dus die 2 classes gebruik ik. Zou ik nu een blog aan de applicatie toevoegen, dan zou pagination en database een optie zijn die ik wel vaker gebruik. Dus dan zou ik die wel autoloaden. Snap je?
Een bestand wordt pas ge-autoload op het moment dat je het nodig hebt.
Stel je wil een nieuwe User aanmaken. Normaal zou je dan dit doen:
require '/bla/blabla/bla/user.php';
$user = new User();
ALs je gebruik maakt van een autoloader hoef je alleen maar dit te doen:
$user = new User();
De autoloader zorgt dan dat het bestand wordt ingeladen.
(Heeft CodeIgniter maar 28 classes?)
Maar goed, weet iemand hoeveel classes er (globaal) worden geladen per request? Kan iemand hier een globale schatting van doen?
Bij mijn framework zit ik over het algemeen tussen 100 en 150 objecten die geinstantieerd worden per request. Dat zijn dus niet noodzakelijkerwijs zoveel verschillende classes, maar orde van grote 100 moet je toch wel snel aan denken.
Meer input is nog steeds welkom...
Echter denk ik hardop door te zeggen als ik wat autoload dan zal ik alleen die dingen autoloaden die nodig zijn voor de basis dingen. Niet meer of minder.
Nogmaals, totaal geen guru op dit gebied hoor, maar soms lees je van die topics en zet het je aan het denken. :)
Overigens ben ik eens gaan googlen op performance met autoloading en daar kwam ik een interessant stukje leesvoer tegen: http://athos.blogs.balabit.com/2011/03/php-autoload-performance/
"Ik kan ze autoloaden, of ik kan ze gebruiken op het moment dat ik ze nodig heb."
Nee, ze worden automatisch ge-autoload op het moment dat jij ze nodig hebt.
"Dus die 2 classes gebruik ik. Zou ik nu een blog aan de applicatie toevoegen, dan zou pagination en database een optie zijn die ik wel vaker gebruik. Dus dan zou ik die wel autoloaden. Snap je?"
Nee, eerlijk gezegd niet. Je kunt toch gewoon alles autoloaden? De autoload functie wordt alleen maar aangeroepen op het moment dat JIJ besluit om een bepaalde class te gaan gebruiken.
CI heeft die optie gewoon.
Ik hoef in CI geen $foo = new foo(); te doen.
Dat word gewoon via een load class geregeld.
Er zit een spraak verwarring in mijn pleidooi.
De verwarring is ontstaan doordat CI iets autoload noemt wat voor de hele applicatie beschikbaar is.
Dacht dus gewoon teveel in CI. :)
Even een in code:
Code (php)
1
2
3
4
2
3
4
<?php
// /config/autoload.php
$autoload['libraries'] = array('database', 'session');
?>
// /config/autoload.php
$autoload['libraries'] = array('database', 'session');
?>
Wat ook kan is bijvoorbeeld in je controller/model iets loaden.
Code (php)
My bad..
Ozzie PHP op 30/03/2013 15:24:23:
ALs je gebruik maakt van een autoloader hoef je alleen maar dit te doen:
$user = new User();
De autoloader zorgt dan dat het bestand wordt ingeladen.
$user = new User();
De autoloader zorgt dan dat het bestand wordt ingeladen.
Ozzie,
hoe weet jouw autoloader dan dan dat bla/bla/bla/user.php geladen moet worden?
ga je dan in plaats van $user = new User(); iets doen als
$user = createNewInstance('User');
of iets dergelijks?
@Frank: omdat ie intelligent is :-) Op basis van de class naam weet ie wat ie moet doen. Nee ik werk niet met createNewInstance of iets dergelijks.
Ik zeg bijvoorbeeld $session = new Session_Storage(); en dan wordt het juiste bestand gewoon ingeladen. Dat is het principe van een autoloader. Maar omdat ik nu aan het werken ben met een service container zou het zoiets worden als $database = $this->getContainer()->get('database'). De class wordt dan vanzelf aangemaakt met de juiste argumenten. Als het betreffende bestand nog niet eerder is geladen dan doet de autoloader dat. En op die manier kun je dus heel flexibel programmeren.
Maar al met al... vanwege de verwarring van Bart... klopt dat aantal van 100 wel nog steeds? Is dat een goede richtlijn van het aantal classes dat per request moet worden ingeladen?
Toevoeging op 30/03/2013 18:42:21:
precies in get() zit dan functionaliteit om de juiste bestanden te includen waarschijnlijk. en ja weet ik veel hoeveel classes er in een request geladen worden? dat kan zeer uitéén lopen lijkt me, en ik zou dus voor de zekerheid uitgaan van VEEL.
Mijn ervaring leert me op dit moment dat het aantal classes continu aan het uitbreiden ben, niet aan het beperken. Elke keer dat ik tegen iets aanloop wat ik niet eerder ben tegengekomen komen er classes bij. Het getal 100 is voor mij dus wel ongeveer juist, maar ik denk dat dat er nog meer gaan worden in de toekomst. Dat zal bij jou ook wel zo zijn. Misschien zit je nu aan een stuk minder, maar het zullen er alleen maar meer worden in de loop der tijd.
Erwin, thanks voor je toelichting. Wat betreft het HOE, dat is geen probleem. Ik heb het al ingebouwd zelfs. Ik heb een extra if controle ingebouwd die het aantal array elementen telt en afhankelijk daarvan wel of geen actie onderneemt. Bij 100 requires scheelt het qua tijd niet zoveel, maar praat je bijv. over 1.000 of 10.000 requires per request, dan wordt het alweer een wat ander verhaal natuurlijk. Maar ik denk dat ik de extra intelligentie dan maar handhaaf.
Deze classes worden allemaal geladen volgens de class loader van Symfony maar dan een beetje aangepast.
Om een gemakkelijk overzicht van alle classes te zien die aangemaakt zijn voor één request kun je gemakkelijk get_declared_classes() gebruiken.
Gewijzigd op 30/03/2013 22:33:33 door MayDay PHP
Ik heb get_declared_classes() geprobeerd. nooit gerealiseerd dat er al zoveel classes worden aangemaakt. Maar gelukkig doet PHP dat zelf en hoeven die niet door de autoloader :)