Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [rexp] backreference - problem z wydajnoscia
Forum PHP.pl > Forum > PHP
rzseattle
Witam

W mojch szablonach wszechobecne są znaczniki blokow typu:
Kod
<cos:cos param1="1" param2="2"> jakis sobie tekst</cos:cos>

Aby wychwycic te bloki uzywalem wyrazenia:
  1. <?php
  2. $exp = "/<(w+):(w+) *(.*?) *>(.*?)</1:2 *>/ms";
  3. $source = preg_replace_callback( $exp, array( &$this, 'replaceBlock' ), $in );
  4. ?>


Jednak przy wiekszych stringach preg_replace_callback potrafi sie wykonywac i 12 sekund. Potem wyniki sa keszowane i dla end usera to nie ma znaczenia, jednak dla administratora przebudowywującego strone jest to nie do przyjęcia.

Czy ktoś juz zagłębiał sie w problem wykrywania bloków ( autorowie systemow szablonów mowa o was smile.gif ) i dysponuje prostym wyrażeniem lub algorytmem które by rozwiązało ten problem?

pozdrawiam
rzSeattle
FiDO
Hmm, dziwne. Ja w obecnym projekcie uzywam wlasnie preg_replace_callback na kilku(nastu) KB kodu i wykonuje sie on dlugo (ale i tak mniej niz sekunde...) ale glownie ze wzgledu na to co sie dzieje w callbacku (pobieranie danych z bazy i pare innych), jak zostawilem pustego (z odpowiednim returnem) callbacka to calosc smigala standardowo w jakies kilkanascie milisekund.
W systemie szablonow tez tego uzywam i to z znaaaaaacznie bardziej skomplikowanym regexpem (mam jeden - laczony z kilkunastu malych - do wylapywania kazdej - no prawie - mozliwej konstrukcji, wlasnie sprawdzilem.. caly ma ponad 600 znakow), jedna chyba roznica jest taka, ze ja jade plik zrodlowy linia po linii, a nie calosc (bylo mi to potrzebne, zeby moc latwo pokazac w ktorej linii szablonu jest blad). No i nie wiem jak Ty, ale ja kompiluje szablony do php, podobnie jak Smarty tylko, ze szybciej i bez zbednych pierdol winksmiley.jpg Z tego co piszesz wnioskuje, ze Ty tez masz kompilowalne szablony, w sumie nie widze innego rozwiazania, zeby to bylo wydajnie.
Jeszcze jedna roznica polega na tym, ze ja najpierw wylapuje wszystko co jest w delimiterach przeze mnie ustawionych, a dopiero wewnatrz callbacka robie preg_match z tym duzym regexpem, byc moze to ma jakis wplyw na wydajnosc.
W kazdym razie czasy generacji szablonow z reguly maja 2 zera po przecinku, a nierzadko nawet 3, takze cos napewno masz nie tak jak powinno byc.
Napisz moze cos wiecej, co masz na mysli przez wieksze stringi.
rzseattle
Poekserymentowalem trochę i wychodzi na to, że o wiele szybciej wyłapać pocztątki bloków, a potem dopiero w pętli wyłapywać całe bloki bez backreference. Chciałem to zrobic jednym wyrażeniem, czysto i szybko, jednak szwankuje to na stringach o wielkosci nawet tak małej jak 20 - 30 lini standardowego kodu html z dwoma zdefiniowanymi blokami. Dodatkowo to napewno nie wina funkcji callbackowej ponieważ gdy wsadzę tego rexpa do preg_match_all to czas parsowania jest równe długi.

No nic trzeba do tego dopisac stros z blokami i powinno funkcjonować.

Jak dzisiaj sie obrobie to przedstawie przyklad tego co parsowalem w osobnym skrypcie.
FiDO
Ciekawe.. jakos nie przypominam sobie, zeby backreferences dawaly tak w kosc.
Jak mozesz to wyizoluj jakis dzialajacy kawalek kodu do parsowania + przykladowy szablon i umiesc go tutaj to zobacze u siebie czy nie da sie z tym czegos zrobic.
bendi
Cytat(FiDO @ 2005-09-16 19:51:27)
Ciekawe.. jakos nie przypominam sobie, zeby backreferences dawaly tak w kosc.
Jak mozesz to wyizoluj jakis dzialajacy kawalek kodu do parsowania + przykladowy szablon i umiesc go tutaj

O tak dyskusja Ciekawa i ja z chęcia poeksperymentuję, więc do prośby się przyłączam.
FiDO
No wiec nie wytrzymalem zbyt dlugo i w chwili wolnej zrobilem sobie maly tescik smile.gif
Regexpa skopiowalem z pierwszego posta nie robiac (celowo) zadnych zmian.
Jako przykladowy szablon uzylem wygenerowany przez siebie pliczek ok 10KB z dosc duza iloscia elementow blokowych (tak co kilka linijek sie pojawialy srednio).
Testowalem to na P3 450, na ktorym moj obecny projekt generuje sie ponad 10x dluzej niz na moim kompie, wiec spodziewalem sie zdazyc zjesc kolacje w tym czasie winksmiley.jpg
NIestety nie udalo sie.. zjesc kolacji w tym czasie, bo po odpaleniu tego w przegladarce okazalo sie, ze czas wykonania calosci wynosil ok 0.0003 sekundy. Tak wiec albo mierzyles nie ten kawalek kodu co trzeba, albo masz cos "popsute" z systemem lub php, albo cos jeszcze innego co mi teraz nie przychodzi do glowy.
W kazdym razie przynajmniej udalo mi sie zdementowac powolnosc back-references.
splatch
IMO warto zajrzeć do PRADO, jest tam "system szablonów" działający na podobnej zasadzie. Całość opiera się na kilku regexpach a nasŧępnie na zabawie ze stosem i strpos..
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.