use Benchmark; [was: Re: [Cologne-pm] Regexps nehmen fuer file parsing?]

Michael Lamertz mike at lamertz.net
Fri Apr 4 18:45:19 CST 2003


On Fri, Apr 04, 2003 at 08:25:34PM +0200, A. Pagaltzis wrote:
> * Michael Lamertz <mike at lamertz.net> [2003-04-04 16:19]:
> > Ich hab' noch ein Experiment durchgefuehrt, diesmal mit einer dicken Rx
> 
> >         my %field = m{(\w+)=(.*?)(?=/\w+=)}g;
> 
> Versuch's mal mit
> 
> my %field = m{(?:\A|\G)([^=]+)=([^/]+)(?:/|\z)}g;

Ooops, ich hab' den letzten Match vergeigt.  Aber das korrigiere ich
auch anders:

    my %field = m{(\w+)=(.*?)(?=/\w+=|/>)}g;

Aber:

    ---------- snip ----------
    nijushiho:~/x$ perl -d -e0
    ...
    main::(-e:1):   0
      DB<1> $_ = '<gh=_var_log(log)/id=00001/fg=0/ab=1/de=20021231(GM)/cd=xy/ef=20030331(GM)/>'
      DB<2> %mine = m{(\w+)=(.*?)(?=/\w+=|/>)}g;
      DB<3> %yours = m{(?:\A|\G)([^=]+)=([^/]+)(?:/|\z)}g;
      DB<4> x \%mine
    0  HASH(0x83d9a40)
       'ab' => 1
       'cd' => 'xy'
       'de' => '20021231(GM)'
       'ef' => '20030331(GM)'
       'fg' => 0
       'gh' => '_var_log(log)'
       'id' => 00001
      DB<5> x \%yours
    0  HASH(0x83d9b78)
       '<gh' => '_var_log(log)'
        ^
        |
*** OOOPS ***
       'ab' => 1
       'cd' => 'xy'
       'de' => '20021231(GM)'
       'ef' => '20030331(GM)'
       'fg' => 0
       'id' => 00001
      DB<6> q
    nijushiho:~/x$ 
    ---------- snip ----------

Wegen der '\A' und '\z'?  musst Du vorher nocht die '<' und '>' aussen
abknipsen.  '\A' brauchst Du auch eigentlich nicht, da '\G' am Anfang einfach 0
ist.  Abgesehen davon matchst Du noch immer auf '[^/]', wodurch der Pfad (gh=)
verwurstet wuerde, haette ich nicht die Rohdaten angepasst.  :P

> (Obwohl die Hash-basierte Lösung auch damit nach wie vor am
> langsamsten ist.)

Ja, schade. :(

Ich hab' nochmal ein Wenig weiter geforscht, und mein Bauchgefuehl, dass
die diversen Splits auf immer neuen Ansatzpunkten langsamer sind als
einmal linear mit der Rx ueber den String zu huschen haben sich dann
doch bestaetigt:

Nimmt man sowohl aus 'rx_hashed' als auch aus 'splitted' die
Hash-Zuweisungen 'raus so aendern sich die Laufzeiten wie folgt:

    ---------- snip ----------
    nijushiho:~/x$ ./bench 
    Benchmark: timing 25 iterations of double_rx, rx_hashed, splitted...
     double_rx:  8 wallclock secs ( 7.75 usr +  0.12 sys =  7.87 CPU) @  3.18/s (n=25)
     rx_hashed: 15 wallclock secs (13.46 usr +  0.17 sys = 13.63 CPU) @  1.83/s (n=25)
      splitted: 24 wallclock secs (23.30 usr +  0.27 sys = 23.57 CPU) @  1.06/s (n=25)
                Rate  splitted rx_hashed double_rx
    splitted  1.06/s        --      -42%      -67%
    rx_hashed 1.83/s       73%        --      -42%
    double_rx 3.18/s      199%       73%        --
    nijushiho:~/x$ 
    ---------- snip ----------

Der Unterschied ist nicht unerheblich.

Whatever!  Bettzeit.

-- 
	    Well, then let's give that Java-Wussie a beating... (me)

Michael Lamertz                        |     +49 2234 204947 / +49 171 6900 310
Sandstr. 122                           |                       mike at lamertz.net
50226 Frechen                          |                 http://www.lamertz.net
Germany                                |               http://www.perl-ronin.de 



More information about the Cologne-pm mailing list