This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
avoid copying the while ebcidic mapping to the stack calling get_a2n()
authorTony Cook <tony@develop-help.com>
Tue, 10 Jun 2014 06:18:34 +0000 (16:18 +1000)
committerTony Cook <tony@develop-help.com>
Wed, 18 Jun 2014 00:47:30 +0000 (10:47 +1000)
from 41.6sec to 34.1sec

get_a2n() is called 181540 times by __uni_latin1() which in most cases
doesn't use the whole table.  Other callers tend to use the whole
table, so make a copy.

regen/charset_translations.pl
regen/ebcdic.pl
regen/mk_PL_charclass.pl
regen/mk_invlists.pl
regen/regcharclass.pl
regen/unicode_constants.pl

index 0ca310e..4ee27a0 100644 (file)
@@ -112,7 +112,7 @@ sub get_a2n($) {
         die "Unknown character set '$charset'";
     }
 
-    return @{$ebcdic_translations{$charset}};
+    return $ebcdic_translations{$charset};
 }
 
 sub get_I8_2_utf($) {
index 60b74aa..0f66230 100644 (file)
@@ -39,7 +39,8 @@ END
 my @charsets = get_supported_code_pages();
 shift @charsets;    # ASCII is the 0th, and we don't deal with that here.
 foreach my $charset (@charsets) {
-    my @a2e = get_a2n($charset);
+    # we process the whole array several times, make a copy
+    my @a2e = @{get_a2n($charset)};
 
     print $out_fh "\n" . get_conditional_compile_line_start($charset);
     print $out_fh "\n";
index 5a073c6..aaefb46 100644 (file)
@@ -260,7 +260,7 @@ END
 
 # Output the table using fairly short names for each char.
 foreach my $charset (get_supported_code_pages()) {
-    my @a2n = get_a2n($charset);
+    my @a2n = @{get_a2n($charset)};
     my @out;
 
     print $out_fh "\n" . get_conditional_compile_line_start($charset);
index 3fb79dd..2a10e1b 100644 (file)
@@ -171,7 +171,7 @@ end_ifndef_ext_re;
 for my $charset (get_supported_code_pages()) {
     print $out_fh "\n" . get_conditional_compile_line_start($charset);
 
-    my @a2n = get_a2n($charset);
+    my @a2n = @{get_a2n($charset)};
     for my $prop (qw(
                     ASCII
                     Cased
index 7919041..0114816 100755 (executable)
@@ -174,7 +174,7 @@ sub __uni_latin1 {
     my @cp;
     my @cp_high;
     my $only_has_invariants = 1;
-    my @a2n = get_a2n($charset);
+    my $a2n = get_a2n($charset);
     for my $ch ( split //, $str ) {
         my $cp= ord $ch;
         $max= $cp if $max < $cp;
@@ -183,7 +183,7 @@ sub __uni_latin1 {
             push @cp_high, $cp;
         }
         else {
-            push @cp, $a2n[$cp];
+            push @cp, $a2n->[$cp];
         }
     }
     my ( $n, $l, $u );
index d9d08e1..81a609b 100644 (file)
@@ -62,7 +62,7 @@ my @data = <DATA>;
 foreach my $charset (get_supported_code_pages()) {
     print $out_fh "\n" . get_conditional_compile_line_start($charset);
 
-    my @a2n = get_a2n($charset);
+    my @a2n = @{get_a2n($charset)};
 
     for ( @data ) {
         chomp;