„Ajťák“ Joker, osobní stránky

Nacházíte se v části webu: Hlavní stránka › Počítače, weby

Šablonovací systémy a PHP- porovnání rychlosti

napsal Joker, 5.4.2009 14.58:48

Použití šablonovacího systému je cesta, jak oddělit prezentační část webu (HTML kód) od samotné aplikace, čímž se obojí zpřehlední, zjednoduší údržba stránek a často i zrychlí přidávání nových stránek. Je ovšem jasné, že režie šablonovacího systému o něco zpomalí zpracování stránky. Proto jsem se rozhodl udělat jednoduchý test a ověřit následující argumenty v debatě o šablonovacích systémech:

  • Šablony zpomalí zpracování stránky. To je jistě pravda, ale jak výrazné to zpomalení bude?
  • Když oddělím prezentaci do zvláštního PHP souboru, tj. jeden skript připraví proměnné a druhý skript bude vpodstatě jen HTML kód s vloženými příkazy pro výpis těch proměnných, bude prezentace a aplikace alespoň zčásti oddělená a přitom to bude stále rychlé.
  • Řešením podle předchozího bodu zbytečně zpomalí skript. Bude lepší celou stránku vypsat přes PHP z jednoho souboru.
  • Jednoduchý šablonovací systém má sice menší možnosti, ale většinou stačí jednoduché šablony, pro které bude rychlejší.
  • Složitější robustní šablonovací systém umí předkompilování šablony, takže po pomalejším prvním zpracování bude pak rychlejší, než jednodušší šablonovací systém. Bude tedy lepší využít robustní šablonovací systém i pro jednoduché šablony.

Co se testovalo

1. PHP

Varianta bez oddělení aplikace a prezentace. Veškerý kód je v jednom PHP skriptu a celá stránka se vypisuje pomocí echo z PHP.

2.  PHP „šablona“

Prezentace a aplikace jsou oddělené do zvláštních PHP skriptů. Aplikační skript připraví proměnné a prezentační skript je potom vypíše do stránky. Prezentační skript používá HTML a do PHP přepíná jen pokud je to nutné. V tomto případě jsou skripty rozděleny do souborů podobně jako šablony u šablonovacích systémů.

3. Smarty

Smarty je velice populární šablonovací systém pro PHP. Ve srovnání bude sloužit jako zástupce robustního šablonovacího systému s mnoha možnostmi. Při testu jsem vycházel z demonstrační šablony, která je přímo součástí Smarty. Nastavení jsem nechával na výchozích hodnotách. Smarty si šablony předkompilovává do PHP, což bylo při testech využité- všechny měřené časy pro Smarty jsou měřené s již předkompilovanou šablonou a s vypnutou kontrolou změn šablony- což myslím si nejvíce odpovídá reálnému nasazení na webu.

4. JoresTemplate

Můj vlastní výtvor bude sloužit jako zástupce jednoduchého šablonovacího systému. Co do šíře možností se nevyrovná Smarty, ale základní možnosti potřebné pro většinu šablon (jako podmínky a dynamické bloky) nabízí. Poznamenám, že i když je to můj vlastní výtvor, nemám z něj žádný komerční prospěch- tolik k mé případné motivaci ovlivnit výsledky testů v jeho prospěch.

Jak se testovalo

Test probíhal přes localhost (kvůli omezení vlivů způsobených zatížením sítě) na počítači s procesorem AMD Athlon X2 5000+ a 2GB RAM, operační systém Ubuntu 8.10 (32-bitový), webserver Apache 2.2.9 s PHP 5.2.6. Každý test se opakoval pětkrát a jako výsledek se počítal průměrný čas. Původně jsem chtěl udělat více opakování, ale vzhledem k minimálním odchylkám ve výsledcích jsem se nakonec omezil na pět.

Testy byly dva:

  • Jednoduchá šablona- hlavní šablona vkládá jeden další soubor se šablonou a obsahuje 15 nahrazovaných proměnných.
  • Složitá šablona- hlavní šablona vkládá jeden další soubor se šablonou, dále obsahuje dynamicky generovaný seznam o 1000 položkách a dynamicky generovanou tabulku s 50 řádky po 50 buňkách.

Náhledy jednotlivých šablon: PHP (veškerý kód je v jednom souboru), šablony přes PHP- jednodušší, složitější, šablony pro Smarty- jednodušší, složitější, šablony pro JoresTemplate- jednodušší, složitější. Vkládaná šablona s názvem "header" obsahuje HTML hlavičku a otevření značky <body> (kód je viditelný ve skriptu pro PHP). Můžete si také stáhnout celý test, včetně všech šablon a skriptů:

Soubor ke stažení

Název:
tpl_benchmark.zip
Datum vytvoření
12. 09. 2013
MD5
8fe385d7c14ebda10df8f3d487e59e01
Zatím staženo
121x

Kliknutím na tlačítko "Stáhnout" soubor stáhnete do svého počítače

Výsledky

Jednodušší šablona

Tabulka obsahuje výsledky za jednotlivé běhy (časy v sekundách, zaokrouhleno na 5 desetinných míst) a porovnání rychlosti relativně k rychlosti čistého PHP skriptu.

Běhphpphp „šablona“SmartyJoresTemplate
1 0,00007 0,00044 0,01439 0,00373
2 0,00008 0,00046 0,01431 0,00375
3 0,00007 0,00046 0,01363 0,00359
4 0,00007 0,00039 0,01348 0,00385
5 0,00007 0,00045 0,01350 0,00364
Průměr 0,00007 0,00044 0,01386 0,00371
% oproti PHP: 100 614,44 19339,31 5179,1

Řešení se rozmístila tak, že každé další je o řád pomalejší, než předchozí. Přesně dle očekávání je nejrychlejší čisté PHP. Rozdělení skriptu do více souborů sice přinese relativně velké zpomalení, ale vzhledem k absolutním časům je to vpodstatě zanedbatelné- i kolísání kvůli zátěži serveru nejspíš způsobí podstatně větší rozdíly v časech. O další řád pomalejší je JoresTemplate, ale ani tak nejde o hodnoty, které by byly nějak zajímavé. Pro srovnání, podobný čas jako zpracování JoresTemplate šablony trvá na testovacím počítači rychlý dotaz v MySQL databázi. Ještě o řád pomalejší pak je Smarty. Stále nejde o nijak dramatické hodnoty, přesto v některých případech by už mohly být zajímavé. Na testovacím počítači rychlost zhruba odpovídá například vrácení celé menší tabulky z MySQL databáze.

Složitější šablona

Testphpphp „šablona“SmartyJoresTemplate
1 0,00824 0,00799 0,05192 0,21224
2 0,00821 0,00796 0,05532 0,30465
3 0,00926 0,00811 0,04988 0,24170
4 0,00827 0,00802 0,04758 0,28916
5 0,00811 0,00754 0,05076 0,28465
Průměr 0,00842 0,00792 0,05109 0,26648
% rychlosti PHP: 100 94,08 606,76 3164,72

Hned při prvním pohledu jedno překvapení: PHP rozdělené na prezentační a aplikační část bylo stejně rychlé, dokonce spíše rychlejší, než čisté PHP. Jediné vysvětlení, které mě napadá, že zpracování v HTML režimu je rychlejší než vypisování HTML kódu z PHP příkazem echo, takže místo velkého množství příkazů echo je lepší PHP ukončit a přepnout do HTML režimu. Samozřejmě by tak šel napsat i čistý PHP kód, ale obávám se, že pak už by se v tom nevyznal vůbec nikdo.

Další výsledky už jsou očekávatelné: Protože Smarty šablony jsou předkompilované do PHP, hlavní část zpomalení tvoří režie systému a samotné zpracování šablony je rychlé. Proto u složitějších šablon relativní zpomalení oproti PHP klesá. U JoresTemplate sice taky relativní zpomalení oproti PHP klesá, ale zdaleka ne tak výrazně.

Pro složitější šablony je tedy z pohledu výkonnosti lepší použít komplexnější šablonovací systém typu Smarty. Dlužno ale poznamenat, že v praxi jsem snad nikdy tak složitou šablonu, jako tahle testovací, nepotřeboval.

Závěr

Rychlost při použití šablon ve srovnání s čistým PHP je vidět v tabulkách. Můj názor je, že ve většině případů nebude zpomalení vlivem šablonovacího systému podstatné. Hlavně v případě jednoduchých šablon může optimalizace jiných míst ve skriptu přinést daleko větší zrychlení, než vynechání šablonovacího systému.

Zároveň se nepotvrdilo, že předkompilace šablon zajistí robustnímu systému výhodu oproti jednoduchému i u jednoduchých šablon. Případů, kdy postačí systém se základními vlastnostmi, je hodně. Potom lze využít nejen výhody jako jednoduchou snadno zapamatovatelnou syntaxi a podobně, ale zároveň je spojit s vyšší rychlostí zpracování.

Pokud jde o rozdělení samotného PHP skriptu na aplikační a prezentační část v případě, kdy nechceme použít plnohodnotný šablonovací systém, vpodstatě není důvod to neudělat. Dopad na rychlost zpracování stránky je většinou neznatelný.

Výhody a nevýhody jednotlivých testovaných řešení bych shrnul asi takto:

PHP

Výhody: Rychlost zpracování a pro PHP programátora odpadá nutnost se učit pracovat s nějakým šablonovacím systémem, prostě jen přímočaře vypisuje stránku přes echo.

Nevýhody: Hlavně u složitějších stránek obvykle i přes veškerou snahu vzniká z kódu naprostý chaos, ve kterém se po pár měsících už nevyzná ani jeho autor, natož někdo jiný. Jakýkoliv zásah do HTML kódu vyžaduje PHP programátora, pokud možno toho, který napsal původní skript. Stránky se tedy špatně udržují, sdílení společných částí často bývá problém.

PHP„šablony“

Výhody: Částečné oddělení aplikačního kódu od prezentace, snazší údržba, není nutné se zabývat nějakým šablonovacím systémem.

Nevýhody: Šablony stále obsahují PHP kód, některé úpravy šablon vyžadují PHP programátora, mnoho prezentačních věcí se přes PHP dělá zbytečně složitě, navíc autor šablony má zbytečně příliš velké možnosti ovlivňovat aplikační kód.

Smarty

Výhody: Oddělení aplikačního kódu od prezentace, široké možnosti, není tak složité jako PHP. Na úpravy šablony není třeba znát PHP.

Nevýhody: Pomalejší zpracování hlavně u jednoduchých šablon, kodér se musí naučit Smarty syntaxi.

JoresTemplate

Výhody: Oddělení aplikačního kódu od prezentace, jednoduchá syntaxe, stačí se naučit pár základních konstrukcí.

Nevýhody: Pomalejší zpracování hlavně u složitých šablon, nenabízí tolik možností jako například Smarty.


[1] od: Gimli × (20.6.2009 14.52:43)
Pro představu by byly užitečné ukázky kódu každé z těchto možností pro ty, kteří se s nimi ještě nesetkali.

[2] od: Mpro × (27.2.2010 8.57:49)
Zdravím, při provádění testů si myslím že by mělo být u smartu rozděleno první spuštění a pak např. následných 5, protože při prvním jsou časy nadměrně velkém protože se vytváří php šablona, která je obsahem shodná jako testované "PHP". Navíc pokud se správném použití smartů se dá používat cachování, které vytváří čisté soubory bez PHP. Test mě ale zaujal :) díky

[3] od: Joker ® (27.2.2010 11.56:25)
Mpro, jak je napsané i v článku, časy Smarty byly měřené s už předkompilovanou šablonou a s vypnutou kontrolou změn, aby to odpovídalo reálnému použití na webu.

[4] od: Tori × (26.10.2010 6.41:49)
Zdravím. Napadlo mne, jestli byste nechtěl přidat srovnání i se šablonovacím systémem z Nette? Mohlo by to být zajímavé pro lidi, kteří nechtějí používat celý framework, ale počítají, že časem se možná projekt rozroste tolik, že to bude nutné. Každopádně děkuji za užitečný test :)

[5] od: Eki × (30.1.2012 18.57:47)
Zdravím, chtěl bych si udělat taky pár testů různých šablonovacích systémů a porovnat je na mé bakalářské práci. Mohl by jste mi poradit v jakém programu jste test prováděl? Popřípadě věděl by jste i o nějakých, které by se daly použít pod windowsem? Předem díky za odpověď :)

[6] od: Joker ® (31.1.2012 10.16:23)
[5] Žádný zvláštní program jsem nepoužíval, jen test přes jednoduchý PHP skript (zpracuje šablonu a spočítá jak dlouho to trvalo). V článku je odkaz ke stažení kompletního testu.

Přidat nový komentář