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

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


On Thu, Apr 03, 2003 at 11:18:50PM +0200, johannes huettemeister wrote:
> 
> > Falls die Reihenfolge der einzelnen Patterns immer dieselbe ist, koennte
> > man die 2 Tests zu einem zusammenfassen, aber Benchmark hat gezeigt,
> > dass das - unerwarteterweise - tatsaechlich ein Wenig langsamer ist.
> 
> haett ich nicht erwartet, letztendlich ist die Performance aber doch nicht
> soo wichtig, denn es geht um ne statistiche Auswertung nur. Und dann koennen
> stilistische krieterien  ne Rolle spielen.

Jau, deshalb hab' ich ja auch betont, dass mir der Zugriff nach
Aristoteles' Methode sehr gut gefaellt.

Ich hab' noch ein Experiment durchgefuehrt, diesmal mit einer dicken Rx
die den String in name/value Paare zerlegt.  Wie Aristoteles ja
angesprochen hatte wird der String via split zerlegt, und die ergebnisse
dann auch nochmal zerteilt.  Diesen doppelten Aufruf zu einem zu
reduzieren spart aber faktisch ueberhaupt nichts, da der teuerste Teil
vermutlich wirklich die Erzeugung des Hashes ist:

    ---------- snip ----------
    # My version of the hash method
    sub splitted {
        local $_ = shift;
        return unless /<(.*)>/;
        my %field = m{(\w+)=(.*?)(?=/\w+=)}g;
        {
            no warnings;  # Avoid warnings for non-existant fields
            $hits{sylvester}++ if $field{ab} == 1 && $field{de} eq '20021231(GM)';
        }
    }
    ---------- snip ----------

und

    ---------- snip ----------
    ...
        rx_hashed   => sub { apply_lines(\&rx_hashed) },
    ...
    ---------- snip ----------

ergibt

    ---------- snip ----------
    nijushiho:~/x$ ./bench 
    Benchmark: timing 25 iterations of array, compiled, double_rx, rx_hashed, single_rx, splitted...
         array: 15 wallclock secs (13.97 usr +  0.17 sys = 14.14 CPU) @  1.77/s (n=25)
      compiled: 15 wallclock secs (14.18 usr +  0.24 sys = 14.42 CPU) @  1.73/s (n=25)
     double_rx:  9 wallclock secs ( 8.02 usr +  0.17 sys =  8.19 CPU) @  3.05/s (n=25)
     rx_hashed: 53 wallclock secs (50.64 usr +  0.30 sys = 50.94 CPU) @  0.49/s (n=25)
     single_rx:  9 wallclock secs ( 8.42 usr +  0.22 sys =  8.64 CPU) @  2.89/s (n=25)
      splitted: 56 wallclock secs (53.77 usr +  0.27 sys = 54.04 CPU) @  0.46/s (n=25)
                 Rate  splitted rx_hashed  compiled     array single_rx double_rx
    splitted  0.463/s        --       -6%      -73%      -74%      -84%      -85%
    rx_hashed 0.491/s        6%        --      -72%      -72%      -83%      -84%
    compiled   1.73/s      275%      253%        --       -2%      -40%      -43%
    array      1.77/s      282%      260%        2%        --      -39%      -42%
    single_rx  2.89/s      525%      490%       67%       64%        --       -5%
    double_rx  3.05/s      560%      522%       76%       73%        5%        --
    nijushiho:~/x$ 
    ---------- snip ----------

Schade eigentlich.

Naja, wenn man spaeter dann doch 'mal erweiterte Performance braucht ist
die Array-Methode ja eigentlich auch ganz gut lesbar.

> Koennen ja am Mittwoch nochmal drueber sprechen. Mehr freu ich mich aber auf
> "Perl Commandline Idiome" ;-)

Grummel!  Das ist Backup fuer harte Zeiten, wenn 'mal was ausfaellt.

-- 
	    Well, then let's give that Java-Wussie a beating... (me)
		-=+ Join Cologne.pm at http://cologne.pm.org +=-

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