Copying large arrays is expensive, so avoid it.
This reduces /$INBOX/ time by around 1%.
---
 lib/PublicInbox/SearchThread.pm | 25 +++++++++++++------------
 lib/PublicInbox/SearchView.pm   |  4 ++--
 lib/PublicInbox/View.pm         |  4 ++--
 3 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/lib/PublicInbox/SearchThread.pm b/lib/PublicInbox/SearchThread.pm
index 41fe859..e086132 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;
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index da31109..0d54c3d 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -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);
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 9f1bf46..e90efda 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -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 ($$) {
-- 
EW


Reply via email to