Dziś jest piątek, 21 listopada 2008 roku (z kalendarza...)

Czas jest tu najważniejszy

Ostatnie duże benchmarki OPT versus Smarty robiłem jeszcze za czasów PHP 5.0.5, osiągając identyczne wyniki obu systemów szablonów. Nie wiem, czy wersja 5.1.2 miała na to wpływ, ale pod wpływem dyskusji na forum php.pl i osobistego "wstawiennictwa" Splatcha przeprowadziłem test jeszcze raz. Świeżutka wersja RC2 przegrała z widoczną różnicą. Nie należy jednak popadać w panikę.

Parser Smarty'ego rozłożyłem dosłownie na czynniki pierwsze i stwierdziłem, że najlepiej napiszę go w podobnym stylu, co oni. Z paru powodów będę musiał całkowicie przerobić tzw. konfigurowalne źródła danych, poważnie rozważam nawet powrót programowania proceduralnego w tym elemencie. Zebrane dane ujawniły kilka niepokojących rzeczy.

  1. W Smarty'm źródła danych w ogóle nie odpowiadają za skompilowane szablony, dzięki czemu można je było załączać zwykłym include. W OPT zostawiłem tę możliwość, ale chyba z niej także zrezygnuję na korzyść tego polecenia.
  2. W jednym z artykułów wyczytałem, że odwoływanie się do funkcji oraz zmiennych lokalnych jest szybsze, niż do pól i metod klasy. Zrobiłem odpowiednie testy, różnica jest doskonale widoczna. Test z użyciem funkcji wykonywał się w czasie ok. 0,00038 sekundy, a kod obiektowy, 0,00049 sekundy. Jaki stąd wniosek? OPT, jak każdy system szablonów, jest wąskim gardłem i często jego wydajność jest kluczowa. Konfigurowalne źródła danych piszemy raz na długi czas, a ponadto jest to tylko sprawa wewnętrzna biblioteki, dlatego w ich przypadku z obiektowego wariantu można zrezygnować. Jednocześnie mam kolejny argument, by nie dać się ponosić różnym modom itd. bez względu na mój b. pozytywny stosunek do OOP :).
  3. Kluczowe znaczenie dla wydajności systemu szablonów mają funkcje systemu plików. Pod test z forum php.pl podstawiłem spreparowaną wersję OPT RC-2, w której dokonałem małego uproszczenia. Mianowicie jeżeli już wcześniej parsowaliśmy dany szablon, biblioteka nie wykonywała ponownie testów czasu modyfikacji funkcjami filemtime(). Rezultat był piorunujący. Czas wykonywania zmniejszył się DZIESIĘCIOKROTNIE. Dokumentacja mówi, że wyniki ww. funkcji są cache'owane, w co nie bardzo wierzę, patrząc na efekty. Niemniej skoro tak jest, rozwiązanie takie mógłbym także wprowadzić ku rozpaczy twórców wszelkiego rodzaju benchmarków ;D.
  4. Kiedy zrobiłem wszystko tak, jak w Smarty'm, OPT nadal przegrywał niewielkimi kawałkami. Szablon liczył 10 kB i wstawionych było do niego 20 bloków. Dla zabawy na koniec pliku dokleiłem jeszcze 100 bloków i OPT bardzo, ale to bardzo zwolnił. Oba systemy szablonów generują nieco inny kod wynikowy. Smarty tworzy statyczny HTML ze wstawkami PHP, OPT jedną wielką wstawkę PHP z HTML'em jako ciągiem. Według zachodnich programistów, miało to OPT'kowi dawać znaczącą przewagę przy dużej liczbie instrukcji w szablonie (parser PHP nie musiałby się przełączać co chwila między trybem HTML, a PHP). Moje wcześniejsze testy też niby to wykazywały, a teraz okazało się to zupełną lipą. Jeśli podmienię OPT'kowi skompilowany szablon na ten ze Smarty'ego, wszystko wraca do normy i czasy obu bibliotek są już równe.

Tak więc widzicie, że bibliotekę czeka parę poważnych zmian. Zrzynanie od Smarty'ego wcale nie jest takie złe. Pamiętajmy, że nad tym parserem siedzieli sami twórcy PHP, więc z pewnością lepiej ode mnie wiedzą, jak prawidłowo wykorzystywać poszczególne elementy języka.

Powrót

Komentarze

Napisał radziel w piątek, 17 lutego 2006 o 18:33

U mnie OPT odczuwalnie zwolnił gdy wrzuciłem 2 postfiltry które odpowiadały za przerabianie linków z "?a=xxx&b=yyy" na "/_/a_xxx/b_yyy". Gdy ten sam kod (filtra) wykonywałem po "przetworzeniu szablonu" ale przed wysłaniem go do użytkownika (ręcznie go przechwytując) czas o pare 0,01 się skrócił.

Wniosek? Czyżby OPT "dławił się" na obsłudze ładowanych z zewnątrz filtrów?

Napisał Zyx w piątek, 17 lutego 2006 o 18:39

Postfiltry są wykonywane tylko wtedy, kiedy pracuje kompilator OPT. Prawdopodobnie zaliczyłeś więc na ich poczet czas... kompilacji szablonu :). Kompilacja jest wykonywana na zasadzie drzewka a'la DOM, więc zabiera sporo mocy, ale ją się od święta wykonuje, więc mogłem sobie na takie coś pozwolić, aby uzyskać większe możliwości. W sumie w tym przykładzie, co podałeś, to powinieneś użyć outputfiltrów, bo postfiltry przetwarzają skompilowany szablon, a nie wynik działania parsera.

Napisał radziel w piątek, 17 lutego 2006 o 19:26

Zyx: Tak, początkowo chciałem skorzystać z outputfiltrów lecz do funkcji odsługujących trafiał pusty bufor :( Być może przyczyną tego stanu rzeczy było wyłączenie przeze mnie buforowania wyjścia OPT ($opt-> gzipCompression = 0) gdyż OPT gryzł się z ob_start() wywołanym przeze mnie na początku skryptu.

Napisał normanos w piątek, 17 lutego 2006 o 21:46

zyx wierze w ciebie :) musi byc szybki i bez rozpaczy dla benchmarkowców ;)

troche mnie to zmartwiło :( zdązylem sie juz do OPTa przyzwyczaić :)

Napisał normanos w piątek, 17 lutego 2006 o 21:50

btw: mozesz podac linka do przytaczanej dyskusji z forum php.pl? nie moge znalexc takiego tematu...

Napisał Zyx w piątek, 17 lutego 2006 o 22:14

Kurde, link ten od Splatcha dostałem, ale nie ma tej rozmowy w archiwum. Tak to bym już na wejściu załączył. Szukaj o systemie Chameleon, bo to się od tego zaczęło.

Wracając do tematu -> mnie również. Poprawa wydajności OPT to punkt honoru :).

Napisał radziel w piątek, 17 lutego 2006 o 22:43

Póki co można się pocieszyć że OPT wspiera komponenty czego nie umie Smaty i Chameleon :)

Napisał Diablos w piątek, 17 lutego 2006 o 22:52

Nie pozwól aby OPT stało sie kopia Smartów w wersji PHP5. Byłaby to wg. mnie porazka, a tworzenie OPT straciło by sens ... skoro OPT ma byc konkurencyjne to niech bedzie, a nie identyczne :P

Napisał Diablos w piątek, 17 lutego 2006 o 22:55

Btw. jesli chodzi o Chameleona i jego wydajnosc, to ja wcale bym sie nia nie sugerował. Nie uwazam Chameleona za profesjonalny system szablonow, nie jest rozbudowana "kobyła", moze słuzyc do małych projektów, a wrecz oczywiste jest, ze cos mniejszego bedzie szybsze.

Napisał normanos w piątek, 17 lutego 2006 o 23:10

link dla zainteresowanych:
http://forum.php.pl/index.php?showtopic=41714

Napisał Slump w sobotę, 18 lutego 2006 o 10:42

Mam rozumiec Zyx, ze przedstawione zmiany nie sa planowane na rc3 a dalej?

Napisał Zyx w sobotę, 18 lutego 2006 o 15:07

Uspokajam, że OPT dokładną kopią Smarty'ego nigdy nie będzie. Mam własną koncepcję systemu szablonów i zamierzam ją rozwijać. Inspiruję się już bardziej rozwiązaniami, które sprawiają, że Smarty jest tak szybki. Interfejs oraz użycie poszczególnych elementów to prywatna sprawa OPT.

Ad. Chameleona -> parser szablonów szybszy od Smarty'ego nietrudno zrobić (raz napisałem taki w 30 minut :)). Trudno, żeby był on równie szybki i dawał podobne możliwości.

Napisał hwao w niedzielę, 19 lutego 2006 o 14:22

Zyx smarty nie jest najlepszym przykladem, sa inne systemy szablonow sporo szybsze niz Smarty.

Napisał Zyx w niedzielę, 19 lutego 2006 o 17:08

Na przykład jakie? Wybacz, ale robiłem testy i Smarty każdy poważniejszy system szablonów mi rozkładał na łopatki, nawet tak ubogi w możliwości, że teoretycznie powinien przegrać :).

BTW. Przyszedł mi do głowy jeszcze jeden, już dosyć hardcore'owy pomysł. Otóż kiedy skończyliśmy już naszą witrynę, po $#%#$% nam w ogóle sprawdzać za każdym razem, czy kompilowane są szablony. Dlatego dodam specjalny tryb. Po jego włączeniu OPT całkowicie oleje sobie sprawdzanie czasów modyfikacji, istnienia plików, zawierzając swe nadzieje w inteligencji programisty :). Wraz z tym dojdzie także narzędzie prekompilatora, które automatycznie skompiluje wszystkie szablony naraz. Oczywiście wszystko to na czas pisania będzie można wyłączyć, przywracając taki stan rzeczy, jaki jest teraz.

Napisał bigZbig w środę, 22 lutego 2006 o 00:29

@Zyx - dzieki fatydze FiDO we wspominnym juz temacie na forum php mozna sie zapoznac z wynikami testow wiekszej liczby templatow.

Co do rezygnacji z OOP. Czego te wasze testy wydajnosciowe wlasciwie dotycza? Konwersji szablonu do postaci czystego php (i html oczywiscie) czy jest to pomiar czasu wykonania skryptu z juz przekonwertowanego szablonu? Moim skromnym zdaniem czas konwersji jest o wiele mniej istotny niz czas generowania stony z szablonow wtornych. Konwersja odbywa sie (a przynajmniej powinna) tylko przy zmianie wygladu szablonu zrodlowego. A jak czesto dokonujemy zmian w szablonie? Na etapie projektowania moze i dosc czesto ale kiedy juz wszystko dziala? Tak czy inaczej nie widze wiekszego sensu rezygnacji z OOP dla paru setnych zaoszczedzonych podczas operacji, ktora dzialajacym systemie nie bedzie prawie w ogole wykonywana. Moim zdaniem o wiele cenniejszy jest pomysl ze specjalnym trybem (TYLKO DLA KUMATYCH). Warto tez zwrocic uwage na niuanse generowanego kodu PHP typu inicjalizacja tablic przed ich uzyciem, obliczanie warunku wykonania petli przed jej wywołaniem itp.

Strona 1 z 2 :: 1 2

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia