From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id B1FA0209B2 for ; Wed, 5 Oct 2016 23:57:25 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 03/17] thread: pass array refs instead of entire arrays Date: Wed, 5 Oct 2016 23:57:08 +0000 Message-Id: <20161005235722.14857-4-e@80x24.org> In-Reply-To: <20161005235722.14857-1-e@80x24.org> References: <20161005235722.14857-1-e@80x24.org> List-Id: 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