]> Sergey Matveev's repositories - public-inbox.git/commitdiff
thread: pass array refs instead of entire arrays
authorEric Wong <e@80x24.org>
Wed, 5 Oct 2016 23:47:18 +0000 (23:47 +0000)
committerEric Wong <e@80x24.org>
Wed, 5 Oct 2016 23:52:27 +0000 (23:52 +0000)
Copying large arrays is expensive, so avoid it.
This reduces /$INBOX/ time by around 1%.

lib/PublicInbox/SearchThread.pm
lib/PublicInbox/SearchView.pm
lib/PublicInbox/View.pm

index 41fe859e76af60aa30cc7aa2481ba00d14d4a12a..e08613286532dc46e2abeefe1f624328d134bc9a 100644 (file)
@@ -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;
index da31109357a0a579fa5c6aa04cb1bf2d1a59c4c1..0d54c3df5c35c9ec485eab8ed7fb17cbb2ac108f 100644 (file)
@@ -156,10 +156,10 @@ sub mset_thread {
        $th->thread;
        if ($q->{r}) { # order by relevance
                $th->order(sub {
-                       sort { (eval { $pct{$b->topmost->messageid} } || 0)
+                       sort { (eval { $pct{$b->topmost->messageid} } || 0)
                                        <=>
                                (eval { $pct{$a->topmost->messageid} } || 0)
-                       } @_;
+                       } @{$_[0]} ];
                });
        } else { # order by time (default for threaded view)
                $th->order(*PublicInbox::View::sort_ts);
index 9f1bf46005ad66c3332ae4e875b5e71cd96254da..e90efda16783ec2241050eededef689ae55af2a5 100644 (file)
@@ -856,10 +856,10 @@ sub skel_dump {
 }
 
 sub sort_ts {
-       sort {
+       sort {
                (eval { $a->topmost->message->header('X-PI-TS') } || 0) <=>
                (eval { $b->topmost->message->header('X-PI-TS') } || 0)
-       } @_;
+       } @{$_[0]} ];
 }
 
 sub _tryload_ghost ($$) {