* [PATCH 10/10] config: config_fh_parse: micro-optimize harder
@ 2020-12-23 8:38 7% ` Eric Wong
0 siblings, 0 replies; 1+ results
From: Eric Wong @ 2020-12-23 8:38 UTC (permalink / raw)
To: meta
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 | 13 +++++++------
1 file 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;
}
^ permalink raw reply related [relevance 7%]
Results 1-1 of 1 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2020-12-23 8:38 [PATCH 00/10] start optimizing startup w/ ALL->misc Eric Wong
2020-12-23 8:38 7% ` [PATCH 10/10] config: config_fh_parse: micro-optimize harder Eric Wong
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).