Peter Makholm skrev:
> For et stykke tid siden sad jeg og skrev på noget kode der skulle
> parse nogle loglinjer. Jeg havde i forvejen to stykker kode, der ikke
> virkede: en der brugte perl og regulære udtryk og en skrevet i C der itererede
> over tegnene i linjen.
>
> Den sidste var lettest at tilrette på en måde hvor det var klart hvad
> der foregik. Men da jeg benchmarkede fandt jeg at uanset hvordan jeg
> greb opgaven an, så var det væsentlig langsommere at iterere over
> bogstaverne i strengen end det ikke specielt pæne regexp jeg havde
> hacket sammen. Væsentligt langsommere var en faktor 8-10.
>
> Er der nogen ide til hvordan man oversætter C-ideomet:
>
> char *c, *p;
> for(p = c;p;p++) {
> /* Gør noget med p */
> }
>
> til noget perl der ikke stinker voldsomt?
First take ville være
foreach my $c (split //, $string) {
...
}
Men det bliver altså utrolig langsomt. En hurtig måling viser at perl
øjensynligt kan noget smartere med substr():
for($i=0; $i<1000000; $i++) {$a .= "a"}
real 0m1.372s
user 0m1.341s
sys 0m0.050s
for($i=0; $i<1000000; $i++) {$a .= "a"}
foreach my $char (split //, $a) { print $char, "\n"}
real 0m4.566s
user 0m3.955s
sys 0m0.220s
for($i=0; $i<1000000; $i++) {$a .= "a"}
for(my $i=0; $i<100000; $i++) { print substr($a,$i,1), "\n"}'
real 0m1.572s
user 0m1.552s
sys 0m0.030s
Så regner man initialiseringen af strengen fra, tager det blot 200ms at
kigge på resultatet fra substr(), frem for at bruge split. Det er en
reduktion i køretid til ca. 15%.
Om det så er brugbart for dig må jo komme an på en prøve.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at
http://michael.zedeler.dk/