Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zalety autoloadera i map klas
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
bigZbig
Odnosnie map klas i autoloadera zastanawialem sie nad wydajnoscia ich stosowania. Co prawda mapa klas (oczywiscie zakladajac ze jest tworzona przy pomocy generatora) w polaczeniu z autoloaderem pozwala na ogromna elastycznosc w przenoszeniu plikow miedzy katalogami. Z drugiej strony majac ogromna liczbe klas - liczoną w setkach - taka mapa rozrasta nam sie do ogromnych rozmiarow. Dodawanie tablicy liczacej kilkaset pozycji, z ktorych w danym wywolaniu skorzystamy zaledwie z kilkunastu (no moze z kilkudziesieciu) jest zbednym balastem dla naszego skryptu.

Mozna oczywiscie zastosowac manewr z dzieleniem tablic na kilka mniejszych. Dla kazdego "narzedzia", "aplikacji", zestawu skryptow czy jak to nazwiemy tworzymy osobna mape klas, ale jest to jedynie rozwiazanie polowiczne. Jesli przykladowo stworzymy osobna mape dla naszego systemu szablonow, osobna dla abstrakcji dostepu do bazy danych itd. to jesli nawet wykonamy jedno najprostsze zapytanie i wyswietlimy jego wynik przy pomocy wspomnianego szablonu to i tak musimy dolaczyc zaikludowac mapy. Zapewne istnieje jakas bardziej rozsadna metoda zarzadzania mapa klas, ale w chwili obecnej nie przychodzi mi taka na mysl. Moze ktos z was taka zaproponuje.

Ja ze swej strony wole recznie dbac o dodawanie odpowiednich plikow. Jesli jakas klasa dziedziczy po innej to zwyczajnie w klasie dzidziczacej inkluduje plik z klasa rodzicielska. Jedyny problem to niekiedy niepotrzebne sprawdzanie include_once w chwili kiedy dana klasa jest juz dodana. Inna niedogodnoscia jest utrata elastycznosci ale udalo mi sie to do pewnego stopnia obejsc przy pomocy definiowania stalej oraz dirname(__FILE__).

Co sadzicie o wydajnosci stosowania automap i autoloadera oraz czy waszym zdaniem lepiej miec wieksza swobode w przemieszczaniu plikow czy bardziej zoptymalizowana aplikacje i czy ta optymalizacja jest naprawde warta zachodu jakim jest reczna dłubanina?
halfik
tablica kilkuset elemetnow to zaden tragizm.
a wszystko jak zawsze zalezy czy musisz soft optymalnie meczyc - wysiskac z niego ostatnie soki.

ja osobiscie uwazam, ze jesli nie ma wyrazneych wskazan, lepiej jest poswiecic ciut wiecej pamieci etc. w zamian za wieksza elastycznosc i wygode pozniejszej pracy.
Ociu
To pytanie takie jak: mając dużo pieniędzy wolisz jeździć maluchem czy mercedesem smile.gif. To nic strasznego. Wiadomo, coś za coś. Czas strony troszke ucierpi nad tym, ale lepiej po mieć automatyke, niż ręczne wstawianie do tablicy. Można mieć wydogę, klime, el. szyby, poduszki etc. Ale, cierpi na tym spalanie winksmiley.jpg Tak samo jest z automatycznym tworzeniem mapy. Gdy masz jedną wielką mapę, nie tracisz zbyt wiele, a gdy masz te wszystkie bajery wzrasta Ci zużycie paliwa (Tak.. mając właczoną klimę zwiększa się spalanie.) to samo jest z autoloaderem. Gdy masz podzielenie na mapy, zwiększa się czas tworzenia ich. trzeba najpierw sprawdzić jakie to pliku, stworzyć plik, stworzyć mape i dopiero ładowac mape. a gdy masz jedną wielką klase, poprsotu pakujesz wszystkie klasy tworzysz jeden, pakujesz mape i voila.

Wszystko sprowadza się do stwierdzenia: Jak kto woli.
dr_bonzo
Osatnio myslalem nad takim rozwiazaniem (tez wspomniane w http://forum.php.pl/index.php?showtopic=26107 ):
- automatycznie generujemy mape z danych katalogow
- podczas uruchomienia aplikacji zbieramy dane o zalaczanych plikach
- analizujemy czestotliwosc zalaczania kazdego z plikow i te czesto zalaczane (powiedzmy w 50%-100% wywolan aplikacji) includujemy statycznie (require_once), lub pakujemy do jednego pliku (automatycznie, skryptem) i zalaczamy.

Nie tracimy na elastycznosci, a plik ze statycznym ladowaniem "klas" mozemy generowac skryptem na podstawie danych statystycznych. Wydaje sie byc idealne biggrin.gif
bela
A co to jest tablica kilkaset elementowa? Kilka milionów to tak, ale nie napiszesz w php czegoś z taką ilością plików.
Ja mam 150 plików, przy zapytaniu załączam jakieś 20-25 klas, skrypt wykonuje się 0.03, a więc tyle co nic.
Nie ja testowałem, a splatch winksmiley.jpg
splatch
Wszystko zależy od kodu:
http://blog.dywicki.pl/index.php/2005/09/22/28-optimization
bigZbig
Ok mapa fajna rzecz jak sie buduje wlasna aplikacje, ale jesli chcialbym wlaczyc moje skrypty do cudzego frameworka to albo zabieram ze soba rowniez mojego generatora map i dostosowuje wszystko do lokalnego autoloadera, albo korzystam z generatora danego frameworka .

Hej czy tak naprawde ten autoloader nie jest troszke rozwiazaniem dla leniwych? Jak czesto sie zmienia strukture plikow. W momencie - nazwijmy to - oddania aplikacji do uzytku uklad plikow powinien byc juz ustabilizowany. Osobiscie rozwazam uzywanie generatora map jedynie na etapie tworzenia, testowania skryptow, ewentualnie do wygenerowania sobie sciezek, ktore pozniej wkleje do instrukcji include_once. W moim autoloaderze zaimplementuje mechanizm raportowania kazdego uzycia, albo alert ze dana klasa zostala wlaczona przy pomocy autoloadera. W ten sposob nie zapomne o dolaczeniu zadnego pliku przed ostatecznym "oddaniem go do uzytku".

Mam tez inny pomysl aby stworzyc taki generator, ktory wygeneruje mape klas i na tej podstawie w kazdym pliku zawierajacym include_once zaktualizuje sciezke do odpowiedniej klasy. Oczywiscie skrypt ten bylby uruchamiany tylko w chwili reorganizacji struktury plikow.
NuLL
Cytat
Hej czy tak naprawde ten autoloader nie jest troszke rozwiazaniem dla leniwych?

TAK biggrin.gif

Autoload jest dosc wolny wbrew pozorom i ja sobie tylko autoloader pozostawiam to zabaw dev abym potem go wywalic smile.gif
hawk
No to pójdźmy o krok dalej. Jaki jest sens w oddanym do użytku kodzie umieszczać include_once, skoro można umieścić kod załączanego pliku? Przecież to drugie rozwiązanie będzie bardziej wydajne.

Zaleta autoloadera jest taka, że nie mamy wpisanych na sztywno ścieżek do pliku i nic nas nie zmusza do tego, aby klasa Foo była w pliku foo.php. Podobną optymalizację widziałem kiedyś w starym mojavi (w nowym nie wiem jak jest): wersja debug składała się z wielu plików, wersja produkcyjna z jednego dużego. Tylko że a) pewnie autor musiał ręcznie wywalać include_once, i cool.gif niektóre klasy były ładowane niepotrzebnie. A tutaj możemy policzyć/zmierzyć, jak często jaka klasa jest wywoływana, i umieścić w jednym pliku tylko te najczęściej używane.
splatch
W Mojavi 4 mechanizm ten uległ zmianie. Teraz wszystkim zarządza PackageLoader: http://trac.mojavi.org/browser/branches/4..../package/loader
Tworzy on mapy w katalogach, tak jak mówił BigZip. Użycie: http://trac.mojavi.org/browser/branches/4....ent-profile.php
.dragonfly
Cytat(NuLL @ 2006-01-20 12:48:29)
Autoload jest dosc wolny wbrew pozorom i ja sobie tylko autoloader pozostawiam to zabaw dev abym potem go wywalic smile.gif

Na jakiej podstawie tak piszesz? Gdy wygenerwoana mape przez autoloader dodasz do Cache i z niej pozniej bedziesz korzystal roznica jest naprawde mala.
NuLL
Mowie o samym autoloadingu jako procesie porownujac go do zwyklego require_once - generacje map zostawmy w spokoju.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.