Greed is bad. More specifically, greedy quantifiers for some regexes are bad; they can slow things down.
I compared your regex (called greedy) with a version using the +? nongreedy qualifier, both against your string (where both will give correct results) and a much longer string, where the non-greedy version will match the first 3 codes, and the greedy version will match the first code and the last 2.
$ perl testGreed.pl
Benchmark: running greedyLong, greedyShort, notGreedyLong, notGreedySh
+ort,
each for at least 3 CPU seconds...
greedyLong: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 42
+264.23/s (n=127004)
greedyShort: 4 wallclock secs ( 3.20 usr + 0.01 sys = 3.21 CPU) @ 8
+8692.45/s (n=284348)
notGreedyLong: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @
+ 46018.76/s (n=144729)
notGreedyShort: 3 wallclock secs ( 2.99 usr + 0.01 sys = 3.00 CPU)
+@ 101593.68/s (n=305289)
Rate greedyLong notGreedyLong greedyShort notG
+reedyShort
greedyLong 42264/s -- -8% -52%
+ -58%
notGreedyLong 46019/s 9% -- -48%
+ -55%
greedyShort 88692/s 110% 93% --
+ -13%
notGreedyShort 101594/s 140% 121% 15%
+ --
As you can see, the non-greedy version runs considerably faster, since it doesn't wind up trying as many alternatives (a.k.a. backtracking).
Here's the comparison code:
Those results were with 5.6.1 on Cygwin, your results may vary.
--
Mike |