diff options
author | Eric Wong <e@80x24.org> | 2020-12-23 08:38:53 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2020-12-23 23:46:45 +0000 |
commit | 74e705e24dffaf4dcb3952910678df7529783762 (patch) | |
tree | e41506e06e5212f2441f97471fcd52f4fb150dcc | |
parent | a05445fb400108e60ede7d377cf3b26a0392eb24 (diff) | |
download | public-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.pm | 13 |
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; } |