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>

Cor! Like yer ring! ... HALO dammit! ... 'Ave it yer way! Hal-lo, Mister la-de-da. ... Like yer ring!

In reply to Re: Difference between (foo|) and (foo)? by BrowserUk
in thread Difference between (foo|) and (foo)? by Derek2

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.