Mam do czynienia z aplikacją internetową, która korzysta z własnego systemu szablonowego, który pozwala na osadzanie kodu Perl w kodzie HTML. Te instrukcje są wykonywane przez analizator szablonów w czasie wykonywania przy użyciu eval EXPR
.Szybsza alternatywa dla eval?
Jest to bardzo elastyczne, ale te instrukcje są rozproszone wszędzie i są wykonywane jako część. eval EXPR
(w przeciwieństwie do eval BLOCK
) wymaga od Perla odpalania tłumacza za każdym razem, a moje profilowanie ujawnia, że są one dość istotnym źródłem spowolnienia.
Wiele wbudowanych instrukcji Perl jest bardzo prostych. Na przykład, szablon może mieć linię:
<p>Welcome, <!--E: $user->query('name') -->.
czyli
<p>Ticket number <!--E: $user->generate_ticket_number() --> has been generated.
Oznacza to, że są one po prostu wywołanie metody obiektu. Ale są też bardziej skomplikowane.
Mam nadzieję, że zoptymalizuję to i do tej pory mam dwie pomysły, obie są okropne. Pierwszym z nich jest przepisanie wszystkich szablonów w celu zastąpienia prostych wywołań tokenami takimi jak USER:NAME
i USER:GENERATETICKETNUMBER
, które parser mógłby następnie wyszukać i wywołać odpowiednią metodę obiektu. Ale zamiast zajmować się szablonami łączącymi HTML i Perl, mam szablony łączące HTML, Perl i tokeny.
Drugą ideą jest próba przeanalizowania osadzonego perla, dowiedzieć się, co chce zrobić instrukcja, a jeśli jest to wystarczająco proste, wywołać metodę odpowiedniego obiektu za pomocą odniesienia symbolicznego. To oczywiście szalone.
Czy jest jakieś logiczne rozwiązanie, które przeoczyłem?
+1 za "To jest oczywiście szalone." –