Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [rexp] backreference - problem z wydajnoscia
rzseattle
post 16.09.2005, 09:48:14
Post #1





Grupa: Przyjaciele php.pl
Postów: 554
Pomógł: 0
Dołączył: 4.04.2002
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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


--------------------
"Real children don't go hoppity-skip unless they are on drugs."
Go to the top of the page
+Quote Post
FiDO
post 16.09.2005, 15:16:43
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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.


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
rzseattle
post 16.09.2005, 17:46:28
Post #3





Grupa: Przyjaciele php.pl
Postów: 554
Pomógł: 0
Dołączył: 4.04.2002
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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.


--------------------
"Real children don't go hoppity-skip unless they are on drugs."
Go to the top of the page
+Quote Post
FiDO
post 16.09.2005, 18:51:27
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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.


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
bendi
post 17.09.2005, 11:42:52
Post #5





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
FiDO
post 18.09.2005, 13:27:26
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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.


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
splatch
post 19.09.2005, 10:23:01
Post #7





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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..


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.07.2025 - 14:49