about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2020-12-23 08:38:53 +0000
committerEric Wong <e@80x24.org>2020-12-23 23:46:45 +0000
commit74e705e24dffaf4dcb3952910678df7529783762 (patch)
treee41506e06e5212f2441f97471fcd52f4fb150dcc
parenta05445fb400108e60ede7d377cf3b26a0392eb24 (diff)
downloadpublic-inbox-74e705e24dffaf4dcb3952910678df7529783762.tar.gz
Instead of relying on split() and a regexp, we'll drop split()
entirely and rely on index() + two substr() calls to operate on
fixed strings.  This brings PublicInbox::Config->new time down
from 0.98s down to 0.84s.
-rw-r--r--lib/PublicInbox/Config.pm13
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index 60107d45..21f2161a 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -132,13 +132,14 @@ sub default_file {
 
 sub config_fh_parse ($$$) {
         my ($fh, $rs, $fs) = @_;
-        my (%rv, %section_seen, @section_order, $line, $k, $v, $section, $cur);
+        my (%rv, %seen, @section_order, $line, $k, $v, $section, $cur, $i);
         local $/ = $rs;
-        while (defined($line = <$fh>)) { # performance critical with giant configs
-                chomp $line;
-                ($k, $v) = split($fs, $line, 2);
+        while (defined($line = <$fh>)) { # perf critical with giant configs
+                $i = index($line, $fs);
+                $k = substr($line, 0, $i);
+                $v = substr($line, $i + 1, -1); # chop off $fs
                 $section = substr($k, 0, rindex($k, '.'));
-                $section_seen{$section} //= push(@section_order, $section);
+                $seen{$section} //= push(@section_order, $section);
 
                 if (defined($cur = $rv{$k})) {
                         if (ref($cur) eq "ARRAY") {
@@ -160,7 +161,7 @@ sub git_config_dump {
         return {} unless -e $file;
         my $cmd = [ qw(git config -z -l --includes), "--file=$file" ];
         my $fh = popen_rd($cmd);
-        my $rv = config_fh_parse($fh, "\0", qr/\n/);
+        my $rv = config_fh_parse($fh, "\0", "\n");
         close $fh or die "failed to close (@$cmd) pipe: $?";
         $rv;
 }