erstellt von max, am 02.04.2008 23:24

ich hab jetzt relativ viel zeit investiert, um das rendering in webtek, von string-processing und vielen regular expressions, auf in perl-code uebersetzte templates umzubauen, ... mit maessig erfolg, denn leider ist perl's string-processing viel zu schnell um dort einen wirklichen vorteil rauszuholen.

einen aehnlichen ansatz hatte schon adrian im jahre 2001, als er fuer uboot eine templating engine in C programmiert hat, ... mit genauso wenig erfolg.

ein beispiel:

man wuerde ja denken, dass gerade die standard unix commandos schnell sind, aber...

imac:DrMap max$ time find . -not -path '*.svn*' -name '*.tpl' | wc -l
     198

real	0m0.233s
user	0m0.153s
sys	0m0.078s

braucht deutlich laenger als

imac:DrMap max$ time perl -e \
'foreach (`find .`) { next if /.svn/; next unless /.tpl\n$/; print }' \
| wc -l
     198

real	0m0.112s
user	0m0.036s
sys	0m0.083s

also dass hat mich dann schon stutzig gemacht (ich hab beide kommandos mehrere male ausgefuehrt, damit auch ja alle sys-calls im betriebssystem-cache sind).

nochmal zum eigentlichen thema. hurra jetzt ist es so, dass webtek um 5 - 10% schnellere responsezeiten hat (hab mir min. 30% erwartet). aber das programmieren hat wiedermal viel spass gemacht. der compiler ist ein einfacher rekursiver parser mit folgender syntax:

Terminale:
==========
CHAR           -> .
EQUAL          -> =
DOT            -> \.
PIPE           -> \|
ESCAPE         -> \\
QUOTE_START    -> " | ' | q\{ | q\[ | q\(
QUOTE_END      -> " | ' | \} | \] | \)
SPACE          -> \s+
NAME           -> \w+
MACRO_START    -> <%
MACRO_END      -> %>

NonTerminale:
=============
Template       -> ( Macro | CHAR )*
Macro          -> MACRO_START
                  SPACE
                  NAME ( DOT NAME )*
                  ( Param )*
                  ( PIPE SPACE NAME ( Param )* )*
                  SPACE
                  MACRO_END
Param          -> NAME EQUAL QUOTE_START Template QUOTE_END

und wiedermal, was ich an perl so mag, mit sehr wenig code-zeilen:

  • scanner: 24 zielen
  • parser: 70 zielen
  • aus dem syntax-tree perl code erzeugen: 100 zeilen

wers genauer wissen will, hier der Compiler und hier der alte Renderer.

einen kleinen trost gibt es. es sollte jetzt doch leicht moeglich sein weitere macro-funktionalitaet zu implementieren (wie z.b. ein loop macro)

so denn...

1 Kommentar(e):

#6 Adrian Smith sagte am 03.04.2008 05:35
Adrian Smith
Ich habe den Compiler ein bisschen angeschaut - sehr cool!!!! Und ja das stimmt wirklich mit Perl speed. Es ist unglaublich. Ich habe mal eine Artikel von Sun gelesen, wieso Java schneller ist als Perl für Text-Processing. Klang überzeugend wenn man es las aber jede Test, den ich je gemacht habe, zeigt C, Java, usw, sind alle deutlich langsamere als Perl.

Neuen Kommentar schreiben: