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ů:
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ěh | php | php „šablona“ | Smarty | JoresTemplate |
---|---|---|---|---|
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
Test | php | php „šablona“ | Smarty | JoresTemplate |
---|---|---|---|---|
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.