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