about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2024-03-11 19:40:10 +0000
committerEric Wong <e@80x24.org>2024-03-12 06:18:17 +0000
commit166532d5a7fb7409db8e7877ca961afb60ad28e5 (patch)
tree3a548dd4cb9c88de5bef5b866c3e0d05c8088592 /lib/PublicInbox
parent8d6a50ff2a4412e66731cbad36b2c33c18e6a89e (diff)
downloadpublic-inbox-166532d5a7fb7409db8e7877ca961afb60ad28e5.tar.gz
With my current mirror of lore + gko, this saves over 300K
allocations and brings the allocation count in this area down
to under 5K.  The reduction in AV refs saves around 45MB RAM
according to measurements done live via Devel::Mwrap.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/CodeSearch.pm11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/PublicInbox/CodeSearch.pm b/lib/PublicInbox/CodeSearch.pm
index 1f95a726..48033bb5 100644
--- a/lib/PublicInbox/CodeSearch.pm
+++ b/lib/PublicInbox/CodeSearch.pm
@@ -292,6 +292,7 @@ W: cindex.$name.topdir=$self->{topdir} has no usable join data for $cfg_f
 EOM
         my ($ekeys, $roots, $ibx2root) = @$jd{qw(ekeys roots ibx2root)};
         my $roots2paths = roots2paths($self);
+        my %dedupe; # 50x alloc reduction w/ lore + gko mirror (Mar 2024)
         for my $root_offs (@$ibx2root) {
                 my $ekey = shift(@$ekeys) // die 'BUG: {ekeys} empty';
                 scalar(@$root_offs) or next;
@@ -320,9 +321,15 @@ EOM
                                 if (my $git = $dir2cr{$_}) {
                                         $ibx_p2g{$_} = $git;
                                         $ibx2self = 1;
-                                        $ibx->{-hide_www} or
-                                                push @{$git->{ibx_score}},
+                                        if (!$ibx->{-hide_www}) {
+                                                # don't stringify $nr directly
+                                                # to avoid long-lived PV
+                                                my $k = ($nr + 0)."\0".
+                                                        ($ibx + 0);
+                                                my $s = $dedupe{$k} //=
                                                         [ $nr, $ibx->{name} ];
+                                                push @{$git->{ibx_score}}, $s;
+                                        }
                                         push @$gits, $git;
                                 } else {
                                         warn <<EOM;