]> Sergey Matveev's repositories - public-inbox.git/commitdiff
config: config_fh_parse: micro-optimize
authorEric Wong <e@80x24.org>
Wed, 23 Dec 2020 08:38:52 +0000 (08:38 +0000)
committerEric Wong <e@80x24.org>
Wed, 23 Dec 2020 23:46:44 +0000 (23:46 +0000)
We can avoid a slow regexp capture and instead and rely on
rindex + substr to extract the section from the config file.

Then we use the defined-or-assignment (//=) operator combined
with the documented return value of `push' to ensure @section_order
is unique without repeating a hash lookup.

Finally, we avoid short-lived variables inside the loop and
declare them subroutine-wide to knock a teeny bit of allocation
time.

Combined, these optimizations bring the ~1.22s
PublicInbox::Config->new time down to ~0.98s with 50K inboxes.

lib/PublicInbox/Config.pm

index 4d143c6e3cc6620a920ec1ca30b463afe6df5e7d..60107d455d5e36ed42c218285887c3ee7f26da9d 100644 (file)
@@ -132,20 +132,15 @@ sub default_file {
 
 sub config_fh_parse ($$$) {
        my ($fh, $rs, $fs) = @_;
-       my %rv;
-       my (%section_seen, @section_order);
+       my (%rv, %section_seen, @section_order, $line, $k, $v, $section, $cur);
        local $/ = $rs;
-       while (defined(my $line = <$fh>)) {
+       while (defined($line = <$fh>)) { # performance critical with giant configs
                chomp $line;
-               my ($k, $v) = split($fs, $line, 2);
-               my ($section) = ($k =~ /\A(\S+)\.[^\.]+\z/);
-               unless (defined $section_seen{$section}) {
-                       $section_seen{$section} = 1;
-                       push @section_order, $section;
-               }
+               ($k, $v) = split($fs, $line, 2);
+               $section = substr($k, 0, rindex($k, '.'));
+               $section_seen{$section} //= push(@section_order, $section);
 
-               my $cur = $rv{$k};
-               if (defined $cur) {
+               if (defined($cur = $rv{$k})) {
                        if (ref($cur) eq "ARRAY") {
                                push @$cur, $v;
                        } else {