Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] Chameleon 1.9.1
Forum PHP.pl > Inne > Oceny
Stron: 1, 2, 3
Bastion
Witam ponownie,

Biorąc pod uwagę opinie i zalecenia forumowiczów , powstała pierwsza stabilna i oficjalna wersja klasy Chameleon do obsługi szablonów. Na wstęp drobne porównanie z klasą Smarty.

Test symulujący całkowite przeładowanie strony z wykorzystanie cache dyskowego.
Smarty korzysta ze skompilowanych szablonów , Chameleon z mapy tagów :

Smarty : 500 iteracji (20 zmiennych) = 0.3475s
Smarty : 500 iteracji (10 zmiennych) = 0.3067s
Smarty : 500 iteracji (5 zmiennych) = 0.2965s
Chameleon : 500 iteracji (20 zmiennych) = 0.2336s
Chameleon : 500 iteracji (10 zmiennych) = 0.2095s
Chameleon : 500 iteracji (5 zmiennych) = 0.2105s

Kolejny test symulujacy kilkakrotne parsowanie szablonu podczas jednego wywolania strony, sytuacja ma miejsce gdy parsujemy kilkakrotnie ten sam szablon (np. formatka newsa) z zaladowana mapa tagow w pamieci. Oto wyniki :

Smarty : 500 powtórzeń (20 zmiennych) = 0.2462s
Chameleon : 500 powtórzeń (20 zmiennych) = 0.0981s

---------------- Co potrafi Chameleon :
# Cache tagow na dysku twardym
# Zmienne typu : {zmienna} {test}
# Zmienne tablicowe jednowymiarowe : {tablica[0]} {tablica[1]}
# Zagniezdzone IFy dowolnej glebokosci z obsluga negacji oraz ELSE (Narazie warunek sprawdzany jest logicznie tylko czy zmienna jest ustawiona)
# Petle szablonowe
# Podswietlanie blednych tagow
# Proste operacje matematyczne
----------------------------------------------------------

  1. <?php
  2.  
  3. require_once('../libs/class.chameleon.php');
  4.  
  5. $tpl = new Chameleon;
  6.  
  7. // Ustawienie sciezek dostepu do szablonow i cache mapy tagow
  8. $tpl->template_dir = './templates'; // default
  9. $tpl->tags_dir = './templates_tags'; // default
  10.  
  11. // Ustawienie czy przechowywac tagi
  12. $tpl->store_tags = true; // default
  13.  
  14. // Wczytsanie szablonu
  15. $tpl->load('example1.tpl');
  16.  
  17. // Dodanie zmiennej
  18. $tpl->setVar('title', 'Witaj przyjacielu');
  19.  
  20. // Wyswietlenie szablonu
  21. $tpl->display();
  22.  
  23. ?>

Przyklad 1 : Zmienne zwykle
Szablon : http://www.vertis.com.pl/chameleon/example...es/example1.tpl
Demo : http://www.vertis.com.pl/chameleon/example...es/example2.php

--

  1. <?php
  2.  
  3. require_once('../libs/class.chameleon.php');
  4.  
  5. $tpl = new Chameleon;
  6.  
  7. // Ustawienie sciezek dostepu do szablonow i cache mapy tagow
  8. $tpl->template_dir = './templates'; // default
  9. $tpl->tags_dir = './templates_tags'; // default
  10.  
  11. // Ustawienie czy przechowywac tagi
  12. $tpl->store_tags = true; // default
  13.  
  14. // Wczytsanie szablonu
  15. $tpl->load('example3.tpl');
  16.  
  17. // Dodanie zmiennej
  18. $tpl->setVar('title', 'Witaj przyjacielu');
  19.  
  20. // Zmienna tablicowa
  21. $tablica = array('0' => 'mama', '1' => 'tata');
  22. $tpl->setVar('rodzice', $tablica);
  23.  
  24. // Wyswietlenie szablonu
  25. $tpl->display();
  26.  
  27. ?>

Przyklad 3 : Zmienne tablicowe
Szablon : http://www.vertis.com.pl/chameleon/example...es/example3.tpl
Demo : http://www.vertis.com.pl/chameleon/example...es/example3.php

--

  1. <?php
  2.  
  3. require_once('../libs/class.chameleon.php');
  4.  
  5. $tpl = new Chameleon;
  6.  
  7. // Ustawienie sciezek dostepu do szablonow i cache mapy tagow
  8. $tpl->template_dir = './templates'; // default
  9. $tpl->tags_dir = './templates_tags'; // default
  10.  
  11. // Ustawienie czy przechowywac tagi
  12. $tpl->store_tags = true; // default
  13.  
  14. // Wczytsanie szablonu
  15. $tpl->load('example6.tpl');
  16.  
  17. // Dodanie zmiennej
  18. $tpl->setVar('title', 'Witaj przyjacielu');
  19. $tpl->setVar('zmiennaA', 10);
  20. $tpl->setVar('zmiennaC', true);
  21.  
  22. // Wyswietlenie szablonu
  23. $tpl->display();
  24.  
  25. ?>

Przyklad 6 : Warunki
Szablon : http://www.vertis.com.pl/chameleon/example...es/example6.tpl
Demo : http://www.vertis.com.pl/chameleon/example...es/example6.php

--

  1. <?php
  2.  
  3. require_once('../libs/class.chameleon.php');
  4.  
  5. $tpl = new Chameleon;
  6.  
  7. // Ustawienie sciezek dostepu do szablonow i cache mapy tagow
  8. $tpl->template_dir = './templates'; // default
  9. $tpl->tags_dir = './templates_tags'; // default
  10.  
  11. // Ustawienie czy przechowywac tagi
  12. $tpl->store_tags = true; // default
  13.  
  14. $newsy[0] = array ('topic' => 'Temat Pierwszy', 'content' => 'Tresc 1');
  15. $newsy[1] = array ('topic' => 'Temat Drugi', 'content' => 'Tresc 2');
  16. $newsy[2] = array ('topic' => 'Temat Trzeci', 'content' => 'Tresc 3');
  17. $newsy[3] = array ('topic' => 'Temat Czwarty', 'content' => 'Tresc 4');
  18.  
  19. // Wczytsanie szablonu
  20. $tpl->load('example7.tpl');
  21.  
  22. // Dodanie zmiennej
  23. $tpl->setVar('title', 'Witaj przyjacielu');
  24. $tpl->setVar('newsy', $newsy);
  25.  
  26. // Wyswietlenie szablonu
  27. $tpl->display();
  28.  
  29. ?>

Przyklad 7 : Petle w szablonie
Szablon : http://www.vertis.com.pl/chameleon/example...es/example7.tpl
Demo : http://www.vertis.com.pl/chameleon/example...es/example7.php

--

Klasę w wersji 1.0.0 można pobrać z http://www.vertis.com.pl/
hwao
chciałbym jeszcze zobaczyc "skompilowany plik" smile.gif o ile takowy jest (czy to przed eval czy w cache).

Czy jest cos jak include?

ify?
Chewolf
Cytat(hwao @ 2006-02-10 08:30:40)
ify?

ekhm ify to chyba warunki... więc kolega podał przykład wyżej
Bastion
hwao : tu sa przechowane tagi (cache) : ags/' target='_blank

jesli chodzi o includy biggrin.gif wiedzialem ze czegos jeszcze brak biggrin.gif dorobie
nospor
hmmm, fajne smile.gif

Rzecz, która od razu rzuca mi się w oczy to kolorowanie zmiennych, których nie ma. W przypadku gdy szablon bedzie rozbudowany, duzo info na stronie bedzie, najzwyklej w swiecie ta informacja o niezdefiniowanych zmiennych umknie. Powinien byc jasny i wyraźny komunikat, że taka i taka zmienna nie istnieje, że taki a taki index tablicy jest nieokreślony. Tekst ten powinien sie wyswietlic albo zamiast zmiennej, albo gdzies na górze. Oczywiście mozna by ustawić, czy takie info ma sie wyswietlac. Np. wyswietlac tylko w trybie debug. (podczas tworzenia aplikacji)
Bastion
nospor : Brdzo dobry pomysl. Znalazl sie juz u mnie na tapecie razem z includami smile.gif
nospor
hehe, żeby nie bylo, że to ja taki genialny. Tak jest wlasnie w smartym, którego uzyles do testow. Gdy brak zmiennej, to zamiast niej lecą warningi. Czegoś takiego nie da się nie zauwazyć winksmiley.jpg

ps: czasy co pokazales są bardzo obiecujące. Może wyjdzie z tego coś ciekawego smile.gif
Bastion
smile.gif idac za ciosem moze dodac tez tryb SILENT, np gdy zmienna {VAR} nie bedzie zdefiniowana zostanie poprostu pominieta, albo dodac specjalny operator "cichych" zmiennych

np w przypadu gdy nie bedzie zmiennej

przy {VAR} wyswietli sie warning
a przy {?VAR} zostanie pominiety.

da to fajna mozliwosc gdy ktos np nie bedzie mial ustawionego Emaila to sie pyknie w szablonie {?EMAIL} zamiast

{@if(EMAIL)} {EMAIL} {@fi}
nospor
Cytat
da to fajna mozliwosc gdy ktos np nie bedzie mial ustawionego Emaila to sie pyknie w szablonie {?EMAIL} zamiast

{@if(EMAIL)} {EMAIL} {@fi}
Akurat do tego to zly przyklad dales. Bo taka sytuacja:
Kod
{@if(EMAIL)} Twoj email:{EMAIL} {@fi}

a jesli wlaczyc tryb silent:
Kod
Twoj email:{?EMAIL}
Przy braku ustawionej zmiennej email, tekst "Twoj email:" dalej bedzie sie wyswietlal winksmiley.jpg

W szablonach tryb silent do zmiennych jest zbedny. Te komunikatu o braku zmiennych są przydatne na etapie tworzenia aplikacji. Zazwyczaj dostaniesz go gdy zrobisz jakąs literowke lub cos w tym stylu. gdy juz aplikacja bedzie dzialala, to raczej same z siebie literowki w kodzie się nie będą pojawialy winksmiley.jpg
Bastion
moze i racja smile.gif musze sie z tym przespac tongue.gif aarambo.gif
Diablos
Bastion: zainteresuj sie jeszcze OPT i jego mozliwosciami: opt.openpb.net
Bastion
tzn. czym dokladnie?
bigZbig
Open Power Template
Bastion
BigZbig : znam juz ten adres - a pytalem na co konkretnie zwrocic uwage smile.gif
ActivePlayer
co do trybu silent.. w smartym jest cos takiego jak modyfikator default. uzycie
Kod
{$sth|default:"asdas"}

jesli $sth jes tpuste to pokaze sie 'asdas'... moze to kogos zainspiruje smile.gif
Bastion
smile.gif poszlo na tapete smile.gif cool.gif
bigZbig
Cytat(Bastion @ 2006-02-10 16:32:59)
BigZbig : znam juz ten adres - a pytalem na co konkretnie zwrocic uwage smile.gif

Moze zwyczajnie zrobisz testy tak jak to uczyniles ze smarty.
Bastion
@bigZbig

moze powiesz mi jak zmusic by OPT tylko parsowal zamiast wyswietlac wynik parsowania ?

  1. <?php
  2. function opt_tpl_1_1()
  3. {
  4. $tpl = new optClass;
  5. $tpl->root = './opt/templates/';
  6. $tpl->compile = './opt/templates_c/';
  7. $tpl->httpHeaders(OPT_HTML);
  8. $tpl->gzipCompression = 0;
  9. for ($i = 0; $i < 20; $i++)
  10. {
  11. $tpl->assign("var$i", 'blah');
  12. }
  13. $tpl->parse('template.tpl');
  14. }
  15.  
  16. ?>
bigZbig
Nie znam mozliwosci OPT wiec Ci nie powiem, ale jesli sam je odkryjesz, albo uzyskasz taka informacje od autora to sie podziel. Tymczasem moze zrobilbys inny test polegajacy na wyswietleniu okreslonych porcji danych (przy uzyciu analogicznych szablonow). Pierwsze wyswietlenie i drugie - taki maly pomiar czasu. Zrob jakies w miare proste szablony bez zaawansowanej funkcjonalnosci. Chetnie sie zapoznam z wynikami takiego testu.
ActivePlayer
  1. <?php
  2. echo $tpl->fetch('template.tpl');
  3. ?>

smile.gif
Bastion
bigZbig :

Smarty : 500 iteracji (20 zmiennych) = 0.3002s
Smarty : 500 iteracji (10 zmiennych) = 0.2838s
Smarty : 500 iteracji (5 zmiennych) = 0.2702s
Smarty : 500 powtórzeń (20 zmiennych) = 0.2337s
Chameleon : 500 iteracji (20 zmiennych) = 0.2065s
Chameleon : 500 iteracji (10 zmiennych) = 0.2106s
Chameleon : 500 iteracji (5 zmiennych) = 0.2020s
Chameleon : 500 powtórzeń (20 zmiennych) = 0.1194s
OPT : 500 iteracji (20 zmiennych) = 0.3786s
OPT : 500 iteracji (10 zmiennych) = 0.3648s
OPT : 500 iteracji (5 zmiennych) = 0.3442s
OPT : 500 powtórzeń (20 zmiennych) = 0.2496s

Szablon testowy Chameleon : http://www.vertis.com.pl/trash/template1.tpl
Szablon testowy Smarty / OPT : http://www.vertis.com.pl/trash/template2.tpl

Oba sa analogiczne - 20 zmiennych - rozmiar ~10kB
FiDO
Jak mozesz to udostepnij caly kod testujacy, tak zebym mogl odpalic to u siebie.. chetnie porownam do swojego systemu winksmiley.jpg Dodam tez cos od siebie, bo ten test jest troche za prosty.. prosta zamiana zmiennych to za malo jak na obiektywny test.
Bastion
  1. <?php
  2.  
  3. include_once('chameleon/class.chameleon.php');
  4. include_once('smarty/Smarty.class.php');
  5.  
  6. define('OPT_DIR', './opt/lib/');
  7. include_once('opt/lib/opt.class.php');
  8.  
  9. function get_microtime()
  10. {
  11. list($usec, $sec) = explode(" ", microtime());
  12. return ((float)$usec + (float)$sec);
  13. }
  14.  
  15.  
  16. // - OPT -
  17. function opt_tpl_1_1()
  18. {
  19. $tpl = new optClass;
  20. $tpl->root = './opt/templates/';
  21. $tpl->compile = './opt/templates_c/';
  22. $tpl->httpHeaders(OPT_HTML);
  23. $tpl->gzipCompression = 0;
  24. for ($i = 0; $i < 20; $i++)
  25. {
  26. $tpl->assign("var$i", 'blah');
  27. }
  28. $tpl->fetch('template.tpl');
  29. }
  30.  
  31. // - OPT -
  32. function opt_tpl_1_2()
  33. {
  34. $tpl = new optClass;
  35. $tpl->root = './opt/templates/';
  36. $tpl->compile = './opt/templates_c/';
  37. $tpl->httpHeaders(OPT_HTML);
  38. $tpl->gzipCompression = 0;
  39. for ($i = 0; $i < 10; $i++)
  40. {
  41. $tpl->assign("var$i", 'blah');
  42. }
  43. $tpl->fetch('template.tpl');
  44. }
  45.  
  46. // - OPT -
  47. function opt_tpl_1_3()
  48. {
  49. $tpl = new optClass;
  50. $tpl->root = './opt/templates/';
  51. $tpl->compile = './opt/templates_c/';
  52. $tpl->httpHeaders(OPT_HTML);
  53. $tpl->gzipCompression = 0;
  54. for ($i = 0; $i < 5; $i++)
  55. {
  56. $tpl->assign("var$i", 'blah');
  57. }
  58. $tpl->fetch('template.tpl');
  59. }
  60.  
  61. function opt_tpl_2_1()
  62. {
  63. $tpl = new optClass;
  64. $tpl->root = './opt/templates/';
  65. $tpl->compile = './opt/templates_c/';
  66. $tpl->httpHeaders(OPT_HTML);
  67. $tpl->gzipCompression = 0;
  68. for ($i = 0; $i < 20; $i++)
  69. {
  70. $tpl->assign("var$i", 'blah');
  71. }
  72. for ($i=0; $i<500; $i++)
  73. {
  74. $tpl->fetch('template.tpl');
  75. }
  76. }
  77.  
  78. // - SMARTY -
  79. function smarty_tpl_1_1()
  80. {
  81. $tpl = new Smarty;
  82. $tpl->template_dir = './smarty/templates';
  83. $tpl->compile_dir = './smarty/templates_c';
  84. $tpl->compile_check = false;
  85. for ($i = 0; $i < 20; $i++)
  86. {
  87. $tpl->assign("var$i", 'blah');
  88. }
  89. $tpl->fetch('template.tpl');
  90. }
  91.  
  92. function smarty_tpl_1_2()
  93. {
  94. $tpl = new Smarty;
  95. $tpl->template_dir = './smarty/templates';
  96. $tpl->compile_dir = './smarty/templates_c';
  97. $tpl->compile_check = false;
  98. for ($i = 0; $i < 10; $i++)
  99. {
  100. $tpl->assign("var$i", 'blah');
  101. }
  102. $tpl->fetch('template.tpl');
  103. }
  104.  
  105. function smarty_tpl_1_3()
  106. {
  107. $tpl = new Smarty;
  108. $tpl->template_dir = './smarty/templates';
  109. $tpl->compile_dir = './smarty/templates_c';
  110. $tpl->compile_check = false;
  111. for ($i = 0; $i < 5; $i++)
  112. {
  113. $tpl->assign("var$i", 'blah');
  114. }
  115. $tpl->fetch('template.tpl');
  116. }
  117.  
  118. function smarty_tpl_2_1()
  119. {
  120. $tpl = new Smarty;
  121. $tpl->template_dir = './smarty/templates';
  122. $tpl->compile_dir = './smarty/templates_c';
  123. $tpl->compile_check = false;
  124.  
  125. for ($i = 0; $i < 20; $i++)
  126. {
  127. $tpl->assign("var$i", 'blah');
  128. }
  129.  
  130. for ($i=0; $i<500; $i++)
  131. {
  132. $tpl->fetch('template.tpl');
  133. }
  134. }
  135.  
  136. // - CHAMELEON -
  137. function chameleon_tpl_1_1()
  138. {
  139. $tpl = new Chameleon;
  140. $tpl->template_dir = './chameleon/templates';
  141. $tpl->tags_dir = './chameleon/templates_tags';
  142. $tpl->load('template.tpl');
  143. for ($i = 0; $i < 20; $i++)
  144. {
  145. $tpl->setVar("var$i", 'blah');
  146. }
  147. $tpl->parse();
  148. }
  149.  
  150. function chameleon_tpl_1_2()
  151. {
  152. $tpl = new Chameleon;
  153. $tpl->template_dir = './chameleon/templates';
  154. $tpl->tags_dir = './chameleon/templates_tags';
  155. $tpl->load('template.tpl');
  156. for ($i = 0; $i < 10; $i++)
  157. {
  158. $tpl->setVar("var$i", 'blah');
  159. }
  160. $tpl->parse();
  161. }
  162.  
  163. function chameleon_tpl_1_3()
  164. {
  165. $tpl = new Chameleon;
  166. $tpl->template_dir = './chameleon/templates';
  167. $tpl->tags_dir = './chameleon/templates_tags';
  168. $tpl->load('template.tpl');
  169. for ($i = 0; $i < 5; $i++)
  170. {
  171. $tpl->setVar("var$i", 'blah');
  172. }
  173. $tpl->parse();
  174. }
  175.  
  176. function chameleon_tpl_2_1()
  177. {
  178. $tpl = new Chameleon;
  179. $tpl->template_dir = './chameleon/templates';
  180. $tpl->tags_dir = './chameleon/templates_tags';
  181. $tpl->load('template.tpl');
  182. for ($i = 0; $i < 20; $i++)
  183. {
  184. $tpl->setVar("var$i", 'blah');
  185. }
  186. for ($i=0; $i<500; $i++)
  187. {
  188. $tpl->parse();
  189. }
  190. }
  191.  
  192. // -----------------------------------------
  193.  
  194. $start = get_microtime();
  195. for ($i=0; $i<500; $i++)
  196. {
  197.  smarty_tpl_1_1();
  198. }
  199. $end = get_microtime();
  200. print 'Smarty : 500 iteracji (20 zmiennych) = '.number_format($end-$start,4)."s<br />";
  201.  
  202. $start = get_microtime();
  203. for ($i=0; $i<500; $i++)
  204. {
  205.  smarty_tpl_1_2();
  206. }
  207. $end = get_microtime();
  208. print 'Smarty : 500 iteracji (10 zmiennych) = '.number_format($end-$start,4)."s<br />";
  209.  
  210. $start = get_microtime();
  211. for ($i=0; $i<500; $i++)
  212. {
  213.  smarty_tpl_1_3();
  214. }
  215. $end = get_microtime();
  216. print 'Smarty : 500 iteracji (5 zmiennych) = '.number_format($end-$start,4)."s<br />";
  217.  
  218. $start = get_microtime();
  219. smarty_tpl_2_1();
  220. $end = get_microtime();
  221. print 'Smarty : 500 powtórzeń (20 zmiennych) = '.number_format($end-$start,4)."s<br />";
  222.  
  223. // ----------------------------------------------
  224.  
  225. $start = get_microtime();
  226. for ($i=0; $i<500; $i++)
  227. {
  228.  chameleon_tpl_1_1();
  229. }
  230. $end = get_microtime();
  231. print 'Chameleon : 500 iteracji (20 zmiennych) = '.number_format($end-$start,4)."s<br />";
  232.  
  233. $start = get_microtime();
  234. for ($i=0; $i<500; $i++)
  235. {
  236.  chameleon_tpl_1_2();
  237. }
  238. $end = get_microtime();
  239. print 'Chameleon : 500 iteracji (10 zmiennych) = '.number_format($end-$start,4)."s<br />";
  240.  
  241. $start = get_microtime();
  242. for ($i=0; $i<500; $i++)
  243. {
  244.  chameleon_tpl_1_3();
  245. }
  246. $end = get_microtime();
  247. print 'Chameleon : 500 iteracji (5 zmiennych) = '.number_format($end-$start,4)."s<br />";
  248.  
  249. $start = get_microtime();
  250. chameleon_tpl_2_1();
  251. $end = get_microtime();
  252. print 'Chameleon : 500 powtórzeń (20 zmiennych) = '.number_format($end-$start,4)."s<br />";
  253.  
  254. // ----------------------------------------------
  255.  
  256. $start = get_microtime();
  257. for ($i=0; $i<500; $i++)
  258. {
  259.  opt_tpl_1_1();
  260. }
  261. $end = get_microtime();
  262. print 'OPT : 500 iteracji (20 zmiennych) = '.number_format($end-$start,4)."s<br />";
  263.  
  264. $start = get_microtime();
  265. for ($i=0; $i<500; $i++)
  266. {
  267.  opt_tpl_1_2();
  268. }
  269. $end = get_microtime();
  270. print 'OPT : 500 iteracji (10 zmiennych) = '.number_format($end-$start,4)."s<br />";
  271.  
  272. $start = get_microtime();
  273. for ($i=0; $i<500; $i++)
  274. {
  275.  opt_tpl_1_3();
  276. }
  277. $end = get_microtime();
  278. print 'OPT : 500 iteracji (5 zmiennych) = '.number_format($end-$start,4)."s<br />";
  279.  
  280. $start = get_microtime();
  281. opt_tpl_2_1();
  282. $end = get_microtime();
  283. print 'OPT : 500 powtórzeń (20 zmiennych) = '.number_format($end-$start,4)."s<br />";
  284.  
  285. ?>
NetJaro
Bardzo ciekawy projekt.. ahh, trzeba spróbować. smile.gif Gratuluje!
Bastion
NetJaro: Wszystkie uwagi , przedewszystkim krytyczne mile widzane biggrin.gif aarambo.gif
ActivePlayer
dla mnie najwiekszy minus, to ciezka przesiadka ze smartego.
NetJaro
Bastion, prosze, nie zrób z tego projektu jakiegoś wielkiego SMARTY, które będzie zawierało masę funkcji.. smile.gif Może zrobisz konf. (jak jest w OPT), w którym się wybiera jakie opcje są dostępne w klasie (czyli, gdy ktoś nie chce warunków w tpl-kach, oznacza w konfiguratorze i w klasie nie ma tych funkcji) smile.gif
Bastion
@ActivePlayer : dla mnie wielkim minusem jest ogrom Smarty i mala czytelnosc (jak dla mnie) szablonu. Prawda jest taka ze aby uzyc smarty trzeba sie przebic przez mase touturiali. W dodatku z tego co zauwazylem blad w szablonie konczy sie kleska w smarty. Jak dla mnie Smarty daaaaawno zatracil to czym powinny byc szablony. Moze masz racje ze przesiadka jest klopotliwa z istniejacych projektow, ale nic nie stoi na przeszkodzie kozystac z czegos innego w kolejnych.

@NetJaro : spoko-majonez smile.gif jak to sie mowi w mojej wiosce - jesli beda pojawialy sie nowe ciezkie rzeczy beda pojawialy sie jako pluginy. Wlasnie pracuje nad mechanizmem wtyczkek, ktore bedzie mozna latwo wlaczac i wylaczac. Chameleon nigdy nie stanie sie czyms podobnym do Smarty - dlatego wlasnie napisalem ten
SHiP
No cóż klasa jak widze chodzi tylko pod php5 ;] przerobiłem pod 4 (bo php5 nawet nie mam zainstalowanego) właczyłem i 1,9s przy 500 wywolaniach ma 20zmiennych ;] na moim parserze 1,6s(tylko ze moj jest lekko mniej modyfikowalny =) opt nie sprawdzalem bo ta bestia ma za dużo plikow i po prostu mi sie nie chciało winksmiley.jpg

moj komputer: duron 800mhz 256sdram

Wiecie dlaczego takie wyniki? o.O to moze przez wersje php??
Bastion
- dales prawa zapisu na katalog templates_tags ?
- mozesz przekleic tu szablon na ktorym testowales i twoja klase ?

- ja zauwazylem ze testujac ta sama klase tylko przy

przy 500 iteracjach to rozbierznosci miedzy dwoma wykonanymi testami moga wyniesci nawet 20%
przy 1000 iteracjach rozbierznosc jest juz tylko ~8%.
przy 2000 iteracjach ~3%
przy 5000 iteracjach ~1%

smile.gif potem powtorze wszystkie testy dla Smarty/OPT/Chameleon dla 5000 iteracji
ActivePlayer
@bastion: piszesz na temat pluginów... powiem Ci tak... smarty, po usunięciu z niego pluginów, tez jest takim 'niczym', i jak dla mnie smarty wcale nie jest krową. Ty piszesz o tym ze planujesz wprowadzic jakis system plugów, i bedzie je mozna latwo wylaczac. Po napisaniu n dodatkowych opcji tez bedzie mozna powiedziec ze sie zrobila krowa z systemu.
Bastion
@ActivePlayer: moze nie, jesli dobrze sie to rozegra - czas pokaze jak to wyjdzie w praniu, jak wspomnialem na samym poczatku napsialem swoj system ze wzgleu na to ze poprostu nie_lubie smariego, za jego zbyt skomplikowanosc - sam przyznaj ze tworzenie tpl pod smarty jest z lekksza zakrecone .
splatch
Cytat
przyznaj ze tworzenie tpl pod smarty jest z lekksza zakrecone.

Tylko za pierwszym razem smile.gif
ActivePlayer
ok, w takim razie jak zrobisz u Ciebie cos takiego:
1. naprzemiennie kolorowane wiersze
2. formatowanie daty
Jak dla mnie smarty jest naprawde dobre, i wcale nie jest skomplikowane.
Bastion
@splatch : na moim pierwszym razie sie skonczylo smile.gif

@ActivePlayer : moglbys dac przyklady jakies tych requestow

edytowane 13.02.2006 10:00
[..] ciachu ciachu wyniki nieaktualne [..]
ActivePlayer
1. naprzemiennie kolorowane wiersze
w smartym
Kod
{foreach from=$costam name=nazwa item=item}
<div style="background-color: {if $smarty.foreach.nazwa.iteration%2==1}#454545;">{$item}</div>
{foreachelse}
Nie ma wpisów
{/foreach}

albo prosciej
Kod
{foreach from=$costam name=nazwa item=item}
<div style="background-color: {cycle values="#454545, #787878"}" >{$item}</div>
{foreachelse}
Nie ma wpisów
{/foreach}

2. formatowanie daty
  1. <?php
  2. $smarty->assign('data', time())
  3. ?>

Kod
{$data|date_format:"%d-%m-%Y %H:%M"}// parametr jest taki sam jak w funkcji date
Bastion
{cycle} i formatowanie daty dopisane do tapety smile.gif pwoinno byc w nastepnym wydaniu
ActivePlayer
Cytat
Smarty 2.6.12 : 5000 iteracji (20 zmiennych) : 3.2947s :: 100.00%
Chameleon CVS : 5000 iteracji (20 zmiennych) : 2.0229s :: 162.87%

no i widzisz sad.gif ja patrząc na cos takiego wybiore smarty... bo ta krowa dziala szybciej
Bastion
Jakie szybciej ? smile.gif Chameleon tutaj jest szybszy o 62%., w tym tesicie byl szybszy o prawie 1.3s smile.gif

W ogole cos przez weekend nie dzialalo forum, wiec w przyplywie wolnego czasu zoptymalizowalem jeszcze mechanizm tagow i ich wykorzystanie dzieki chameleon w stosunku do wersji 1.0.0 jest szybszy o ~25%. A na tle Smarty i OPT wypada tak :

Smarty 2.6.12 : 5000 iteracji (20 zmiennych) : 3.3956s :: 100.00%
Chameleon CVS : 5000 iteracji (20 zmiennych) : 2.0122s :: 168.75%
OPT 1.0.0-rc2 : 5000 iteracji (20 zmiennych) : 5.0350s :: 67.44%

Smarty 2.6.12 : 5000 iteracji (10 zmiennych) : 3.1111s :: 100.00%
Chameleon CVS : 5000 iteracji (10 zmiennych) : 1.8140s :: 171.50%
OPT 1.0.0-rc2 : 5000 iteracji (10 zmiennych) : 4.9267s :: 63.15%

Smarty 2.6.12 : 5000 iteracji (5 zmiennych) : 3.0177s :: 100.00%
Chameleon CVS : 5000 iteracji (5 zmiennych) : 1.7339s :: 174.04%
OPT 1.0.0-rc2 : 5000 iteracji (5 zmiennych) : 4.7145s :: 64.01%

Smarty 2.6.12 : 5000 powtorzen (20 zmiennych) : 2.5835s :: 100.00%
Chameleon CVS : 5000 powtorzen (20 zmiennych) : 0.7771s :: 332.45%
OPT 1.0.0-rc2 : 5000 powtorzen (20 zmiennych) : 2.7544s :: 93.80%

Dzis bede dodwal includowanie, cycle, formatowanie daty oraz warriningi smile.gif
Kinool
hmm twoje testy sa troche syntetyczne i nie oddaja rzeczywitosci smile.gif raczej nikt nie uzywa 5000 iteracji z 20 zmiennymi w szablonach smile.gif

lepiej by bylo jak bys parsowa np. tablice wielowymiarowa z 20-40 elementami w foreach do tego jakiesz 10 zmiennych i przedstwil wynik takiego testu, to znacznie lepiej odzwierciedla rzeczywistosc smile.gif
Bastion
hum, dobry pomysl, dzis ukoncze wersje 1.1.0 posiadajaca dodtkowo obsluge
Include, Cycle, i formatowanie daty. I zrobie jakis konkretny test.
splatch
... najlepiej używając Apache Benchmark
SHiP
Cytat(Bastion @ 2006-02-11 10:59:01)
- dales prawa zapisu na katalog templates_tags ?
- mozesz przekleic tu szablon na ktorym testowales i twoja klase ?

http://ehand.muminski.be/template.htm
Kod, wiem ze taki bałagan jest tam lekki =) ale po prostu jeszcze lekko to poprawiam...
skrypt testujący
  1. <?
  2. function ehand_tpl_1_1()
  3. {
  4. $tpl = new template;
  5. $tpl -> dir='./';
  6. $tpl -> zaladuj('template.tpl');
  7. for ($i = 0; $i < 20; $i++)
  8. {
  9. $tpl->bloki["var$i"]= 'blah';
  10. }
  11. $tpl -> konwertuj();
  12. }
  13.  
  14.  
  15. $start = get_microtime();
  16. for ($i=0; $i<500; $i++)
  17. {
  18.  ehand_tpl_1_1();
  19. }
  20. $end = get_microtime();
  21. print 'eHand Template : 500 iteracji (20 zmiennych) = '.number_format($end-$start,4)."s<br />";
  22. ?>

rezta tak jak u ciebie... prawa dostepu sa w koncu co windows to windows laugh.gif
ActivePlayer
Cytat
Jakie szybciej ? smile.gif Chameleon tutaj jest szybszy o 62%., w tym tesicie byl szybszy o prawie 1.3s smile.gif

ano fakt, spojrzalem na procenty, i nie wiem skad je brales:) jak dla mnei jesli smarty ma 100% a Twoj system wykonal szybciej parse, to powinien miec 60% or sth smile.gif znaczy sie mniej niz smarty winksmiley.jpg

jak dla mnie to przydala by sie tak for sure opcja uzycia funkcji phpowych. gdyby ktos chcial uzyc np ucfrist lub czegos podobnego. a nie sposob wszystkie funkcje ktore moga sie przydac zamiescic jako 'pluginy'
Bastion
Trach trach - Chameleon 1.1.0 - wydany.

Changelog
- optymalizacje kodu, zwrost wydajnosci od 10 do 20 %
- nowe kolory buttonow : grass, pink, sky
- nowa funkcja laczenia szablonow {@inc(plik.tpl)}
- nowa funkcja formatowania daty {@date(zmienna,"format")}
- trzy tryby pracy debuggera poprzez define('CHAMELEON_DEBUG', tryb)
0 - cicha praca
1 - kolorowanie blednych tagow (domyslnie)
2 - wyswietlanie ostrzezen tekstowych

Kod
To jest plik : <b>exmaple8.tpl</b><br />

{title}<br /><br />

Teraz nastapi dolaczenie pliku example8b.tpl :<br />

{@inc(example8b.tpl)} <br />

A tu znow szablon example8.tpl<br />

Includowanie szablonów
Przykład : http://www.vertis.com.pl/chameleon/examples/example8.php

poprzez dodanie definicji chameleon sypie widocznymi waringami
  1. <?php
  2. define('CHAMELEON_DEBUG', 2);
  3. ?>

Przykład : http://www.vertis.com.pl/chameleon/examples/example9.php

formatwanie daty : {@date(timestamp,"Y-m-d H:i:s")}
gdzie timestamp : $tpl->setVar('timestamp', time);
Przykład : http://www.vertis.com.pl/chameleon/examples/example10.php

---------- uczta numerologa ------ testy syntetycze jak ktos ladnie nazwal - same zmienne zwykle
Smarty 2.6.12 : 5000 iteracji (20 zmiennych) : 3.5313s :: 100.00%
Chameleon 1.1.0 : 5000 iteracji (20 zmiennych) : 2.2199s :: 159.07%
Smarty 2.6.12 : 5000 iteracji (10 zmiennych) : 3.3307s :: 100.00%
Chameleon 1.1.0 : 5000 iteracji (10 zmiennych) : 2.0498s :: 162.49%
Smarty 2.6.12 : 5000 iteracji (5 zmiennych) : 3.2505s :: 100.00%
Chameleon 1.1.0 : 5000 iteracji (5 zmiennych) : 1.9632s :: 165.57%
Smarty 2.6.12 : 5000 powtorzen (20 zmiennych) : 2.8017s :: 100.00%
Chameleon 1.1.0 : 5000 powtorzen (20 zmiennych) : 0.8355s :: 335.33%
Szablon testowy : http://www.vertis.com.pl/trash/template1.tpl
------------------------- testy bardziej naturalne - zmienne, tablice, warunki
Smarty 2.6.12 : 5000 iteracji (10 zmiennych) : 3.3227s :: 100.00%
Chameleon 1.1.0 : 5000 iteracji (10 zmiennych) : 2.9067s :: 114.31%
Smarty 2.6.12 : 5000 powtorzen (10 zmiennych): 2.6862s :: 100.00%
Chameleon 1.1.0 : 5000 powtorzen (10 zmiennych) : 1.3900s :: 193.25%
Szablon testowy : http://www.vertis.com.pl/trash/template2.tpl
-------------------------------------------------------------------------------------------------------------------------

Klasa do pobrania jak zwykle : http://www.vertis.com.pl/
Bastion
free dla niekomercyjnych biggrin.gif chociaz w innych przypadkach tez mozna sie dogadac biggrin.gif za buttonka
SHiP
kurde wywlilem post o licencji bo juz znalazłem =) na o.txt' target='_blank hmm za buttonka =) to byłbym nawet skłonny biggrin.gif tylko nie wiem czy moj projekt duży sukces osiągnie... ale koniec OffTopica =)
Bastion
pelny tekst licencji tu : http://www.vertis.com.pl/chameleon/README
FiDO
Hmm.. mialem chwile wolnego od sesji to sobie porownalem to u siebie i wyszly mi "troche" inne wyniki. Nie robilem testu samego podmieniania zmiennych, bo to bez sensu, wzialem sie od razu za szablon z petlami. Roznica polega na tym, ze szablon mial ~11KB a nie niecale 2KB jak u Ciebie i to spowodowalo, ze tabela sie jakby obrocila: est.png' target='_blank
Byc moze to tylko wina kompa, na ktorym testowalem (jestem w domu, a tu mam dostep tylko do starego poczciwego P3 450), aczkolwiek reszta wynikow raczej pokrywa sie wynikami robionymi na moim kompie w akademiku, wiec moze to byc kwestia tego, ze przy wiekszych plikach podmiana "w locie" (bez kompilacji szablonow do kodu posredniego jak np. w Smarty) po prostu juz wysiada... Jutro wieczorem powinienem byc z powrotem na swojej maszynie, wiec sprawdze to na bardziej dzisiejszym sprzecie, a w miedzyczasie Ty mozesz sprawdzic u siebie.

Druga sprawa.. przegladnalem po lepkach kod tej klasy i widzialem, ze w wielu miejscach uzywasz petli typu while (list($key, $value) = each($tab))
Jest to chyba najmniej wydajny sposob iterowania po tablicy asocjacyjnej w php jaki widzialem. Generalnie ze sposobow iteracji po tablicach do tych podstawowych zaliczamy nastepujace:

1) isset:

for($i = 0; isset($loop[$i]); $i++)

2) size:

for ($i = 0, $n = count($loop); $i < $n; $i++)

3) while:

reset($loop);
while (list($k, $v) = each($loop))


4) foreach:

foreach ($loop as $k => $v)

5) count

for ($i = 0; $i < count($loop); $i++)

6) array_keys:

$keys = array_keys($loop);
for ($i = 0, $n = count($keys); $i < $n; $i++)


Nie wszystkie nadaja sie do tablic asocjacyjnych rzecz jasna.. ale nawet z posrod 3), 4) i 6) to wlasnie 3) jest najwolniejszy. Kiedys robilem pomiary z ciekawosci jak to sie skaluje, wiec moge je zaprezentowac:
est.png' target='_blank
Jak widac foreach wcale nie jest taki zly jakby sie moglo wydawac, wiec nie ma co go na sile unikac. Nie bedzie to rewolucja jak wprowadzisz u siebie, ale jakas roznica na korzysc powinna sie pojawic.. pytanie tylko, na ktorym miejscu po przecinku smile.gif
Slump
Bardzo ciekawy temat smile.gif
Zalezy pod jakim katem testowac, wyniki beda rozne tongue.gif
Fido moze wezmiesz do tstow opt z svn w wersji rc2 i zobaczymy, bo nie wiem z jakiej kozystasz.
A tak btw dyskusja zaowocowala planami malych zmian w opt:
u_najwazniejszy' target='_blank

Napewno przyczyni sie to do poprawy smile.gif
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-2025 Invision Power Services, Inc.