]> Sergey Matveev's repositories - public-inbox.git/commitdiff
config: config_fh_parse: micro-optimize harder
authorEric Wong <e@80x24.org>
Wed, 23 Dec 2020 08:38:53 +0000 (08:38 +0000)
committerEric Wong <e@80x24.org>
Wed, 23 Dec 2020 23:46:45 +0000 (23:46 +0000)
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.

lib/PublicInbox/Config.pm

index 60107d455d5e36ed42c218285887c3ee7f26da9d..21f2161a287bd2743eadbf76b1cb379731f41948 100644 (file)
@@ -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;
 }