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