about summary refs log tree commit homepage
path: root/lib/PublicInbox/SearchThread.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-10-05 23:47:18 +0000
committerEric Wong <e@80x24.org>2016-10-05 23:52:27 +0000
commitc5b3d2549596b773d52e5feb947f461630dfe301 (patch)
tree1e0e16f857a6736d9d9224c7ac121c59f6e062f3 /lib/PublicInbox/SearchThread.pm
parent172416d1cd465da4242cc744a3f309d307f1311d (diff)
downloadpublic-inbox-c5b3d2549596b773d52e5feb947f461630dfe301.tar.gz
Copying large arrays is expensive, so avoid it.
This reduces /$INBOX/ time by around 1%.
Diffstat (limited to 'lib/PublicInbox/SearchThread.pm')
-rw-r--r--lib/PublicInbox/SearchThread.pm25
1 files changed, 13 insertions, 12 deletions
diff --git a/lib/PublicInbox/SearchThread.pm b/lib/PublicInbox/SearchThread.pm
index 41fe859e..e0861328 100644
--- a/lib/PublicInbox/SearchThread.pm
+++ b/lib/PublicInbox/SearchThread.pm
@@ -141,9 +141,9 @@ sub order {
         $root->order_children( $ordersub );
 
         # and untangle it
-        my @kids = $root->children;
-        $self->{rootset} = \@kids;
-        $root->remove_child($_) for @kids;
+        my $kids = $root->children;
+        $self->{rootset} = $kids;
+        $root->remove_child($_) for @$kids;
 }
 
 package PublicInbox::SearchThread::Container;
@@ -163,7 +163,7 @@ sub add_child {
         croak "Cowardly refusing to become my own parent: $self"
           if $self == $child;
 
-        if (grep { $_ == $child } $self->children) {
+        if (grep { $_ == $child } @{$self->children}) {
                 # All is potentially correct with the world
                 $child->parent($self);
                 return;
@@ -220,14 +220,15 @@ sub children {
                 push @children, $visitor;
                 $visitor = $visitor->next
         }
-        return @children;
+        \@children;
 }
 
 sub set_children {
-        my $self = shift;
-        my $walk = $self->child( shift );
-        while (@_) { $walk = $walk->next( shift ) }
-        $walk->next(undef) if $walk;
+        my ($self, $children) = @_;
+        my $walk = $self->{child} = shift @$children;
+        do {
+                $walk = $walk->{next} = shift @$children;
+        } while ($walk);
 }
 
 sub order_children {
@@ -238,9 +239,9 @@ sub order_children {
 
         my $sub = sub {
                 my $cont = shift;
-                my @children = $cont->children;
-                return if @children < 2;
-                $cont->set_children( $ordersub->( @children ) );
+                my $children = $cont->children;
+                return if @$children < 2;
+                $cont->set_children( $ordersub->( $children ) );
         };
         $self->iterate_down( undef, $sub );
         undef $sub;