[perl #76674] Locale::Maketext: speed and efficiency tweaks
authorTodd Rinaldo <toddr@cpan.org>
Tue, 28 Sep 2010 18:13:33 +0000 (11:13 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 28 Sep 2010 18:13:33 +0000 (11:13 -0700)
Check string to compile for chars ~][ and return \"$string" if not found.
This is a 250% speed improvement on strings which don't require compile and only a
~2% hit if they did need compiling.

Remove \G since everything is being captured it has no value. This means we don't
have to worry about seting pos $string_to_compile = 0 to prevent the previous
regex from affecting this one. There is a negligible speed improvement removing
the \G

dist/Locale-Maketext/lib/Locale/Maketext.pm

index cbfcb14..a685d6b 100644 (file)
@@ -489,6 +489,13 @@ sub _compile {
     # It returns either a coderef if there's brackety bits in this, or
     #  otherwise a ref to a scalar.
 
+    my $string_to_compile = $_[1]; # There are taint issues using regex on @_ - perlbug 60378,27344
+
+    # The while() regex is more expensive than this check on strings that don't need a compile.
+    # this op causes a ~2% speed hit for strings that need compile and a 250% speed improvement
+    # on strings that don't need compiling.
+    return \"$string_to_compile" if($string_to_compile !~ m/[\[~\]]/ms); # return a string ref if chars [~] are not in the string
+
     my $target = ref($_[0]) || $_[0];
 
     my(@code);
@@ -499,10 +506,9 @@ sub _compile {
         my $in_group = 0; # start out outside a group
         my($m, @params); # scratch
 
-       my $string_to_compile = $_[1]; # There are taint issues using regex on @_ - perlbug 60378,27344
         while($string_to_compile =~  # Iterate over chunks.
-            m/\G(
-                [^\~\[\]]+  # non-~[] stuff
+            m/(
+                [^\~\[\]]+  # non-~[] stuff (Capture everything else here)
                 |
                 ~.       # ~[, ~], ~~, ~other
                 |