Kas svarbiausia šablonų varikliams

Nuskaičiau šiandien PHP forume įdomią diskusiją apie tai kas svarbiausia PHP šablonų varikliuose (ačiū scooox už nuorodą). Labiausiai prieštaringų minčių man sukėlė citata O jei template nera svarbiausia greitis... tai kas tada svarbu? Navarotai? Jei taip – tada tu grybas. Tiesą sakant „navarotai“ yra labai svarbu. Ir turbūt svarbiausia (na, jei greitis nėra visiškai šliaužiantis). Gyvename tokiais laikais kai kompiuterio laikas yra pigus, o programuotojų laikas kainuoja brangiai, tad aš geriau rinkčiausi lėtesnę šablonų sistemą (na, ne tris kart lėtesnę, bet tarkim iki 50% lėtesnę) jei su ja man būtų žymiai lengviau programuoti. Šablonų kodas vis tiek neužima labai daug laiko, tad geriausiu atveju bus sutaupoma keletas dešimčių tūkstantųjų sekundės kiekvienai užklausai. Sakoma, kad lašas po lašo ir akmenį pratašo, o centą pridėjus prie cento susidaro milijonai, bet abejoju ar šie palyginimai čia tinka. Na, jei svetainė gauna po 10 užklausų per sekundę, gal tada ir bus pastebėtas šioks toks skirtumas kokį šablonų variklį naudosime, bet kiek yra svetainių, kur užklausos ateina po 10 per sekundę? Juk tai beveik milijonas užklausų per dieną (heh, aš esu laimingas kai gaunu kokį tūkstantį ;)

Tad manau, jog šablonų „benchmarkinimas“ yra per daug sureikšminamas. IMHO aišku ;)

Comments Closed

44 Comments

  1. tiesą sakant sunkiai ir įsivaizduoju darbą be šablonų. Nebent su XML/XSL transformacijom. O su visokiom krūvom print tai sunku susitvarkyt jei svetainė bent truputį didesnė už šią.

  2. nu nezinau… man asmeniskai atrodo, kad programinimas turi buti programinimas o ne laminimas… kai kartais isdygsta lamukas ir sugalvoja: gi reikia padaryti kruta peidzha tada ir prasideda: griebia (blogiausiu atveju) frontpage'a sumeta pora lenteliu papeckioja paveiksliuku ar siaip kur is neto visai ne i tema prisirenka… tuomet ko dar gali reiketi?! reikia php… o cia jau silciau: tada pasiima GALINGA 200kb template class'e ir parases pora eiluciu gavo puslapi: nereikia jam nei moketi programyti nei kazka mastyti tiesiog uz tave padaryta, nors tai ir griozdas, nors ir stabdo bet jam dzin jis padare, jam gerai, o kas jau puslapi vartys jam px nes jis savo darba atliko o dabar jau kitu reikalas ka jie darys su jo peidzhu…

    o visa ideja tokia: daugeliui patinka gremezdiski bet DAUG FUNKCIJU atliekantys template'ai nes su juo dirbti uztenka basic ziniu… todel daugelis tokius ir naudoja…

    ata

  3. P.S. "Tad manau, jog šablonų „benchmarkinimas“ yra per daug sureikšminamas. IMHO aišku ;)" tiksliai kaip as apie tai nepagalvojau… kam gi pukomuko raso toki daikta kurio niekam nereikia… juk "programuotojų laikas kainuoja brangiai" …

  4. Na, pats pukomuko rašė apie savo šablonų benchmarkus, kad skirtumai tarp jų tokie maži, kad jie nereikšmingi, didžiausią stabdymą daro duomenų paėmimas iš duomenų bazės.

  5. O šiaip tai kaip tik atvirkščiai yra, kuo labiau patyręs programuotojas, tuo jis mažiau knaisiojasi kode prie mažų dalykų, nes jam reikia kažką sukonstruoti greitai ir stabiliai. Yra toks dalykas kaip code reuse, kurį PHP programuotojai dar gal nelabai įsisavinę — tarkim Perle yra keletas didelių modulių kaip CGI, HTML::Template, kuie gal ir atrodo dideli, bet jie funkcionalūs, ir priimti standartai. Niekas nesiruošia išradinėti dviračio ir knaisiotis kode kad spręstum problemas, kurios jau išspręstos. Yra net posakis, jog 90% Perlo programų jau parašytos, mat užtenka parsisiųsti modulį iš http://search.cpan.org ir viskas. Tuo Perlas ir populiarus. Iš naujo perrašinėdamas modulius ir bandydamas taikyti juos savo reikmėms neabejotinai įvelsi daugiau klaidų, tuo tarpu dideli komponentai (kaip CPAN moduliai ar tas pats Smarty) yra naudojami visų, yra gerai ištestuoti ir juose mažiau bugų (mm… riktų). Aš vat pavyzdžiui labiau pasitikiu Smarty programuotojais nei savimi, bei pukomuko šablonais nei tarkim tavo šablonais, nes juose turbūt likę pakankamai riktų (daug vartotojų reiškia, jog daiktas labiau ištestuotas, o būtent tuo kol kas pasižymi phemplate ir Smarty). Aišku sakysi žiūrėk į kodą, bet tam nėra laiko. Juk reikia dirbt.

    Tikrai gyvenam ne tais laikais, kai visas kodas turėjo būt optimizuotas asemblerio lygyje (beje, jei viskas eina ant greičio, tai kodėl gi šablonų variklio nepadarius su C ir neįsiuvus kaip PHP extensiono? kažkaip jau per ekstremalu atrodo?). Kompiuterių ciklai pigūs, o programerių — ne.

  6. vot cia dar ir yra problemu… praleiskim ta texto dali kurioje lyginama PERL su PHP cia jau prilyginta ir prikalbeta. O vat del pasitikejimo… "[labiau pasitikiu] pukomuko šablonais nei tarkim tavo šablonais, nes juose turbūt likę pakankamai riktų". Gal ir like… gal ir ne, si template'a naudoja bent keletas zmoniu, nemazai bugu istaisyta (turetu nebedaug buti like) ir veikia gana stabiliai, o stai veikia zymiai greiciau: tam paciam pukomuko benchmarke variable'u keitime visuose testuose pirmas, loop'uose lenkia tik (kazkodel) neveikiantis smarty (blogai generuoja puslapi, nes netvarkingai padarytas template'o failas). Taigi kodel gi nepabanzius tokiokims pat galimybemis, taciau greitesni template'a…?

  7. "kodėl gi šablonų variklio nepadarius su C ir neįsiuvus kaip PHP extensiono" nebloga mintis, tik kazkodel niekas tuo neuzsiima

  8. kodel niekas neuzsiema? yra template engine kaip php-c extensionas.

    oryx, imho po poros metu, kai pradesi tikrai dirbt su php prie rimtu projektu, suprasi, kad greitis tai dar nera viskas..

  9. moxliukas: cia gal ir offtopic bet visgi taves neimanoma pagaut irc, yra php funcijos $_POST $_GET, perl turi CGI->param('VAR');, bet jis ima ir is url'o ir POST metodu, pvz as savo pirma komentara idejau per url'a. O jei formoj butu hidden field'u kuriu negali useris keisti?

  10. oryx: kvaila būtų programint viską pačiam – turiu galvoj, kad žmogus vietoj panaudotos 200 kb klasės tikrai neturi susikurt savo. Neverta išradinėti dviračio kai jų jau tiek išrasta. O ir be templeitų daryt kažką didesnio yra nesamonė. Pats dariau dariau, lipdžiau lipdžiau… kol gavos totalus haosas. Aišku kiekvienam poreikiui reikia mokėt teisingai pasirinkti…

  11. ieskojau, ieskojau… ir neradau kur cia pasakyta, kad kai darai DIDELI projekta turi pats pasirasyti savo klase…???

  12. Idealiausiu atveju savo klasių iš vis nereik rašytis, pasiimi egzistuojantį frameworką ir prisiderini sau ;)

  13. oryx:

    naudojau as irgi savo templeitus. dar geras klausimas, ar jie neperspjautu tavo templeitu klases ;) bet po ilgo klaidziojimo ir grybavimo nutariau, kad nieko nera geriau, kaip pripazintas dalykas ir istestuotas, bei kuri zino ir supranta daugiau zmoniu, nei vienas tu pats. nesakau, kad neimanoma suprasti mano rasytu templeitu, bet anyway – geriau tai, ka zmones be vargu greiciau supranta. Ko Lietuvoje daugiau – Smarty zinovu ar tavo templeitu? Kas pakonsultuos, kas duos daugiau?

    Keikiau dar visai neseniai as Smarty, bet dabar po truputi linkstu prie jo. Tu man pasakyk, ar tavo klase palaiko pluginus? Palaiko keshavima puslapio? ir etc.

    Nu va, o siaip sveikinu, kad nemiegi ir bandai. ir as dziaugiaus, kai pasidariau savo templeitus, bet laikui prabegus supratau, kad kartais be reikalo neverta isradinet triratuko dar karta, kai jau yra sukurtas lenktyninis dviratis ;)

    Peace!

  14. peace tai peace bet kad cia ne karas…

    1. aisq lietuvoje daugiau smarty zinovu, nes as tik pries savaite parasiau savo klase… bet kad ji daug zmoniu naudoja nereiskia kad jis yra super (kaip pavyzdy paimkite windows: juos naudoja laabai daug zmoniu, bet ar jie tokie jau super?..)

    2. nu mano klase pluginu nepalaiko, keshavimo taip pat, bet neisivaizduoju kam to reikia, nes kai bandziau su pukomuko benchmarku tai kol sukurdavo smarty objekta, mano klases objektas budavo ir sukuriamas ir dar puslapi sugeneruodavo.

    3. tai galetum atsiusti savo klase template'u: tikrai butu idomu paleisti per benchmark'a ir (gal but) ismokti kazka naujo…

  15. o puko benchmarkai labai jau atspindi realiam gyvenime pasitaikancius uzdavinius? ;)

  16. Paskutiniu metu linkstu visai nenaudoti šablonu.

    Vistiek tai yra papildomas darbas, kad ir koks greitas jis būtų. Kuo {kintamasis} geriau už <?=$kintamasis ?> arba <?php echo $kintamasis ?> ?

    for() arba while() veikia tikrai greičiau negu <loop>

    programos ir vaizdavimo logika galima atskirti ir be templeitu klases, tiksliau pačius templeitus galima daryti naudojantis tik php. Duomenų apdorojimas atliekamas viename faile, o išvedimo HTML yra kitame, su reikiamoje vietoje įstatytais kintamaisiais.

    Be templeitų tikrai galima daryti kažka didesnio, tik reikia teisingai išskaidyti kodą į atskirus failus ir direktorijas.

    Nesinaudojant šablonų klasėmis yra tokie privalumai:

    1. Maksimalus greitis (nereikia uzkrauti nė 0kb klasės),

    2. Nereikia mokykis papildomos sintaksės,

    3. Viską galima daryti tiesiogiai, o ne "per šikną", nes nereikia apeidinėti šablonų variklio trūkumų.(kurių paprastai nemažai yra mažose šablonų klasėse.)

    4. Nėra problemu su skliaustais javascripte ir pan.

    Manau, privalumų galima sugalvoti ir daugiau.

  17. tai ir pabandziau tavo klase. nors klase ir maza, bet ispausti is jos galima ir daugiau…

    gavau tokius rezultatus:

    TEST 1.1 :: 20 registered vars :: 10 iterations

    100% Template Engine 1ms 0.0013917

    117% Easy Template System 2ms 0.0016345

    131% moxliuko sablonas 2ms 0.0018199

    132% phemplate 2ms 0.0018388

    156% bugi 2ms 0.002171

    174% heyes class 2ms 0.0024243

    227% BrainyTemplate 3ms 0.0031574

    307% XTemplate 4ms 0.0042693

    330% phplib tpl 5ms 0.004586

    503% vTemplate 7ms 0.0070022

    514% TemplatePower v3 7ms 0.007153

    1197% Smarty 17ms 0.0166549

    TEST 1.2 :: 5 registered vars :: 10 iterations

    100% Template Engine 1ms 0.001362

    102% bugi 1ms 0.0013937

    110% heyes class 1ms 0.0014959

    123% phemplate 2ms 0.0016711

    128% moxliuko sablonas 2ms 0.0017423

    196% Easy Template System 3ms 0.0026751

    213% BrainyTemplate 3ms 0.0028962

    216% phplib tpl 3ms 0.0029424

    221% XTemplate 3ms 0.0030156

    506% TemplatePower v3 7ms 0.0068869

    530% vTemplate 7ms 0.0072225

    946% Smarty 13ms 0.0128877

    TEST 1.3 :: 100 registered vars :: 5 iterations

    100% moxliuko sablonas 1ms 0.0012028

    125% Template Engine 1ms 0.001507

    211% phemplate 1ms 0.0025392

    265% BrainyTemplate 2ms 0.0031824

    311% XTemplate 2ms 0.0037448

    317% Easy Template System 2ms 0.0038122

    516% bugi 3ms 0.0062112

    533% heyes class 3ms 0.0064066

    671% TemplatePower v3 4ms 0.0080718

    685% vTemplate 4ms 0.0082446

    867% phplib tpl 5ms 0.010426

    1245% Smarty 7ms 0.0149708

    neblogi rezutlatai, nors dar reikia prisiminti, kad mano template'as taip pat ieskojo ir ifset tagu…

    jei norit patys pasitestuoti tai galesiu atsiusti failiukus benchmarkui

  18. Heh, įdomu jei tiesiai su kokiu $_GET[] sutie'inus tai iš vis turbūt skraidytų, bet gi dėl to niekas neims mano proof of concept šablonų naudot ;)

  19. as kazkaip nepaskaiciau NB post'o.

    NB: nu jo cia gerai sakai del privalumu, bet jei tau reikia naudoti bent pora loop'u puslapyje tai biski prisimala, o jei dar reikia pakeisti puslapio dizaina… kas tada?..

    (…nu daba laukiu kaip visi ant manes susoks (tai jau tapo tradicija) kad templatu is tikro visi nenaudoja, ir kad template klasiu visai nereikia…)

  20. Beje, šita idėja, kuri buvo naudojama kaip proof of concept dabar jau yra ir pas phemplate (nuo 1.9 versijos). (žr tie_loop(), tie_var())

    Bet vėlgi nematau čia didelio skirtumo tarp visų šitų šablonų. Nesiskiria man 2 ar 5 milisekundės (juolab kad šitie testai nėra iš tikro gyvenimo — daug dažniau gi pasitaiko ciklai, o ne pavieniai kintamieji)

  21. loopus galima ir tvarkingai išdelioti, kad būtų lengva orientuotis.

    ir nematau skirtumo, ar tie loopai phpiniai ar šabloniniai

  22. tai kad tavo klase loop'u nepalaiko, o gal as tik to nematau?.. o siaip tai reikia ziureti ne i milisekundes o i procentus, nes milisekundes priklauso nuo proco galingumo (ir nevien), o procentai atspindi kiek skiriasi greitis.

  23. cia jau gaunasi chatas o ne forumas (atrodo cia mazdaug toks) nespeji parasyt jau flame'as pareina

  24. Štai man labai patikęs straipsnis iš mod_perl stovyklos (tos pačios idėjos, kurios sukasi apie Perl, tinka ir PHP):

    http://perl.apache.org/docs/tutorials/tmpl/comparison/comparison.html

    Keletas citatų:



    Go on, admit it: you've written a templating system. It's okay, nearly everyone has at some point. You start out with something beautifully simple like $HTML =~ s/\$(\w+)/${$1}/g and end up adding conditionals and loops and includes until you've created your very own unmaintainable monster.

    Nothing can start an argument faster on the mod_perl mailing list than a claim that one approach to templating is better than another. People get very attached to the tools they've chosen.

    Ir svarbiausia:

    People always seem to worry about the performance of templating systems. If you've ever built a large-scale application, you should have enough perspective on the relative costs of different actions to know that your templating system is not the first place to look for performance gains. All of the systems mentioned here have excellent performance characteristics in persistent execution environments like mod_perl. Compared to such glacially slow operations as fetching data from a database or file, the time added by the templating system is almost negligible.

  25. ir beje NB pasiziurek pradzia ir atsargiau su postais nes tuoj ir tave visi puls spardyt…

  26. aga cia gera citata… :) man patiko… tik as vel apsiginti noriu: as tik norejau pasiulyti zmonems nauja klase, o ant manes pradejo sikti… :))))) cia nepykit :)

  27. davai moxliuk daryk kita puslapi ir pratesiam postus nes labai jau daug scrollint reikia :)

  28. Labas, patyrę programuotuojai!

    Nors kiek ne prie temos, bet kaip vertintumėt tokią architekturą : yra duomenu lenteles, yra tarpine lentele (joje saugomas kiekvienos duomenu lenteliu eiluciu indexas su ji talpinanciu lenteles pavadinimu, ir duomenu tipas), yra shablonas( ne shablonu varikliukas, o shablonas).

    HTML faile nurodomas tegas pv. tokiu stiliumi <X table=sasajine_lentele type=duomenu_tipas> __field1__ __field2__ </X>. shablonas pakeicia __field1__ __field2__ duomenemis ish duomenu lenteles tiek kartu kiek to reikia:)

    Esme tokia viena karta tokia sistema aprashius galima tik aprashinet naujo duomenu tipo lenteliu interfeisa. Beto, vaizdavimas yra atskirtas nuo kodo ir greitis pakenciamas.

  29. O as net pakankamai mažus projektus darau su templeitais.

    Niekas man nenuneš to patogumo kai nėra JOKIO kodo HTML'e

    <?=$var?> dar dar, bet kai prasideda ciklai etc. – dalykai darosi vis bjauresni, imi ieškoti, kur pasibaigia html, kur prasideda php, dizaino keitimas tampa laviramvimu tarp kodo gabalų… never again.

    Be to, be išvdimo dar yra ir visokios kitos "biznio logikos", darbas su DB, dar kažkas. Arba tai kišti į tą patį

    php failą su HTML gabalais, arba į atskirą, bet tada turim ką – ne tai kad, kodas atskirtas nuo atvaizdavimo, bet dalis kodo atskirta nuo kitos dalies ir sumaišyta su HTML.. fiu…

    Plius, naudojant templeitus galima panaudoti visiškai tą pati kodą generuojant html, xml, ar plain-text (realus pvz. kai tarkim reikia siusti mailu).

    Ir dar toks mielas malonus dalykas kaip blokai…

  30. negi {$row.id} arba {forearch item=row from=$array} {/foreach} arba {$name|default:"neivestas vardas"|escape: "quotes"}

    vadini "jokio kodo HTML'e"? (pavyzdziai is Smarty)

    del bjaurumo, tai cia tas pats, kaip ir del perl "bjaurumo", kodo grozis labiau priklauso nuo programuotojo programavimo kulturos, o ne nuo to, kokiomis priemonemis tai daroma.

    ir su templeitais galima parasyti slyksciu dalyku.

    mano metodu irgi galima generuoti skirtinga outputa,

    koks skirtumas, ar parsini kita templeita, ar includini kita php faila?

  31. kitame php faile tu tureis surašyti tuos pačius ciklus, etc, etc. – truputį daugiau rašymo. Šablone tik reikiamose vietose

    įrašyti kintamųjų vardus. Pasikeitus logikai nereikės eiti per

    visus turimus php failus ir ten keisti kažką, o pakeisi tik vienoj vietoj.

    Sprendžiant iš pavyzdžio – smarty nenaudosiu, kam man kitas php. Tada galima ir į http://www.parser.ru dairytis.

    Man šablonai pirmiausia ir svarbiausia – būdas atskirti kodą nuo atvaizdavimo, o ne būdas panaudoti kitokį kodą vietoj php kodo.

  32. NB> Tavo pavyzdys su Smarty sintakse rodo, kad jame *galima* naudoti visokius *papildomus* navarotus, t.y. programinima templeite, bet *neprivaloma*. Gali gi rasyt ir paprasta templeita, o jei zmogui patogiau idet kazkoki modifier cia pat – prasom.

  33. ic> o skirtinguose templeituose nerasai tu paciu <loop> tagu?

    Vytas> papildomi navarotai yra tik paskutiniame pavyzdyje.

    aisku, ju galima nenaudoti, bet jie vistiek naudos serverio RAM ir CPU. Del tokiu navarotu vel susilieja programos ir vaizdavimo dalys, tik shi karta nebe PHP kode, o vaizdavime, arba tiksliau, Smarty kode.

  34. Emilis, gal bandei?

    Kad issirinktum templeitu klase is 35, teks ismokti 35 skirtingas sintakses.

    Galetu visi naudotu vienoda, tai nors pereiti nuo vieno prie kito buti lengviau.

    Dabar labai naudingu dalyku galetu buti templeitu abstrakcijos klase. Gal yra norinciu tokia padaryti?

  35. "Galetu visi naudotu vienoda, tai nors pereiti nuo vieno prie kito buti lengviau." <– cia tai taip, tik prie kurios sintaxes… niekas nenoretu savo templeito valdymo keisti i kazkieno kito: visi noretu, kad visi pasikeistu i jo. Taip kad tai nelabai imanoma…

    nors galima padaryti scriptuka, kuris template'u faila perdarytu is vienos valdymo sistemos i kita.

    o su php kodu tai sunkiau…

  36. Po teisybei tikrai nebandzhiau :) esu pora templeitu sistemu kūręs kur kažkas repleisinama, paskiau dirbęs su Phemplate ir skaitinėjęs Smarty manualą. Paskiau spjoviau į viską ir pasirašiau dar vieną savo klasę kuri tiesiai PHP kodą leidžia naudot.

    Iš esmės klasytė, kuri abstrahuoja tokias templeitų klases, kur naudojami pagrinde tik du metodai: paduoti kintamąjį ir parsinti templeitą būtų įmanoma ir netgi naudinga. Tuo tarpu vargti su tuo zoologijos sodu, kuris skirtingai paduoda kintamuosius, loopus, blokus ir dar ką tik įmanoma sugalvoti nematau prasmės — kiekvieno jų veikimo būdas skirtingas. Be to tokios klasės turėtų būti deprecated IMHO ;]

Comments are closed.