in reply to Difference between (foo|) and (foo)?
This intigued me and I thought maybe the 7.5% difference was in the time it took to parse and/or compile the differences in the regexes. So I thought I'd benchmark the test with them pre-compiled. The results are very intriguing. Not only does the difference between the two compiled versions remain pretty much the same, if anything getting slightly bigger. The pre-compiled versions actually run substantially more slowly than their none pre-compiled counterparts? This is most extreme in the case of the (foob|) version running close to 40% faster than its precompiled counterpart.
I'd like to see the explanation behind them onions? Probably my test methodology at fault, but I can't see it.
It took that a stage further and applied study to the searched string. This resulted in a speed-up of the slowest (precompiled (foob)?) and the fastest (the non-precompiled (foob|)), but consistantly slowed the other two varients down.
Intriguing indeed. The test code and results are below
#!/usr/bin/perl no warnings; use strict; use Benchmark qw(cmpthese); $::string = "foofoo catbar"; $::re_foobOrNowt = qr/(foob|)foofoo/o; $::re_foob0or1 = qr/(foob)?foofoo/o; #study $::string; print 'After studying the searched string'.$/; cmpthese( 1000000, { foobOrNowt => 'if ($string =~ m/(foob|)foofoo/) { };', foob0or1 => 'if ($string =~ m/(foob)?foofoo/) { };', c_foobOrNowt=> 'if ($string =~ $::re_foobOrNowt) { };', c_foob0or1 => 'if ($string =~ $::re_foob0or1 ) { };', }); __DATA__ C:\test>201403 Benchmark: timing 1000000 iterations of c_foob0or1, c_foobOrNowt, foob +0or1, foobOrNowt... c_foob0or1: 13 wallclock secs (13.38 usr + 0.00 sys = 13.38 CPU) @ 74 +744.00/s (n=1000000) c_foobOrNowt: 12 wallclock secs (11.85 usr + 0.00 sys = 11.85 CPU) @ +84409.56/s (n=1000000) foob0or1: 10 wallclock secs (10.63 usr + 0.00 sys = 10.63 CPU) @ 94 +117.65/s (n=1000000) foobOrNowt: 8 wallclock secs ( 8.60 usr + 0.00 sys = 8.60 CPU) @ 11 +6238.52/s (n=1000000) Rate c_foob0or1 c_foobOrNowt foob0or1 foobOrN +owt c_foob0or1 74744/s -- -11% -21% - +36% c_foobOrNowt 84410/s 13% -- -10% - +27% foob0or1 94118/s 26% 12% -- - +19% foobOrNowt 116239/s 56% 38% 24% + -- C:\test>201403 After studying the searched string Benchmark: timing 1000000 iterations of c_foob0or1, c_foobOrNowt, foob +0or1, foobOrNowt... c_foob0or1: 12 wallclock secs (12.57 usr + 0.00 sys = 12.57 CPU) @ 79 +567.15/s (n=1000000) c_foobOrNowt: 12 wallclock secs (11.67 usr + 0.00 sys = 11.67 CPU) @ +85711.84/s (n=1000000) foob0or1: 11 wallclock secs (10.65 usr + 0.00 sys = 10.65 CPU) @ 93 +940.82/s (n=1000000) foobOrNowt: 10 wallclock secs ( 8.42 usr + 0.00 sys = 8.42 CPU) @ 11 +8736.64/s (n=1000000) Rate c_foob0or1 c_foobOrNowt foob0or1 foobOrN +owt c_foob0or1 79567/s -- -7% -15% - +33% c_foobOrNowt 85712/s 8% -- -9% - +28% foob0or1 93941/s 18% 10% -- - +21% foobOrNowt 118737/s 49% 39% 26% + -- C:\test>
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Difference between (foo|) and (foo)?
by Anonymous Monk on Sep 30, 2002 at 19:53 UTC | |
by Anonymous Monk on Sep 30, 2002 at 19:57 UTC |