This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
avoid copying the whole map to the stack on each call to get_I8_2_utf()
authorTony Cook <tony@develop-help.com>
Tue, 10 Jun 2014 06:07:12 +0000 (16:07 +1000)
committerTony Cook <tony@develop-help.com>
Wed, 18 Jun 2014 00:47:29 +0000 (10:47 +1000)
took run time from 51.6 sec to 41.6 sec

get_I8_2_utf() is called 147000 times by cp_2_utfbytes() which
typically doesn't use the whole table, so return a reference instead to.

regen/charset_translations.pl
regen/ebcdic.pl

index 92099c7..0ca310e 100644 (file)
@@ -163,7 +163,7 @@ sub get_I8_2_utf($) {
         }
     }
 
-    return @{$I8_TO_NATIVE_UTF8{$charset}};
+    return $I8_TO_NATIVE_UTF8{$charset};
 }
 
 { # Closure
@@ -262,7 +262,7 @@ sub cp_2_utfbytes($$) {
             return chr $ebcdic_translations{$charset}[$ucp];
         }
 
-        my @I8_2_utf = get_I8_2_utf($charset);
+        my $I8_2_utf = get_I8_2_utf($charset);
 
         my $len = $ucp < 0xA0      ? 1 :
                  $ucp < 0x400     ? 2 :
@@ -273,11 +273,11 @@ sub cp_2_utfbytes($$) {
 
         my @str;
        for (1 .. $len - 1) {
-            unshift @str, chr $I8_2_utf[($ucp & 0x1f) | 0xA0];
+            unshift @str, chr $I8_2_utf->[($ucp & 0x1f) | 0xA0];
            $ucp >>= 5;
        }
 
-       unshift @str, chr $I8_2_utf[($ucp & _UTF_START_MASK($len)) | _UTF_START_MARK($len)];
+       unshift @str, chr $I8_2_utf->[($ucp & _UTF_START_MASK($len)) | _UTF_START_MARK($len)];
 
         return join "", @str;
     }
index 055403e..60b74aa 100644 (file)
@@ -56,7 +56,7 @@ foreach my $charset (@charsets) {
         output_table(\@e2a, "PL_e2a");
     }
 
-    my @i82utf = get_I8_2_utf($charset);
+    my @i82utf = @{get_I8_2_utf($charset)};
     print $out_fh <<END;
 /* (Confusingly named) Index is $charset I8 byte; value is
  * $charset UTF-EBCDIC equivalent */