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: AS43350 77.247.176.0/21 X-Spam-Status: No, score=-2.7 required=3.0 tests=AWL,BAYES_00, RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,SPF_FAIL,SPF_HELO_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (politkovskaja.torservers.net [77.247.181.165]) by dcvr.yhbt.net (Postfix) with ESMTP id C7E5F209B1 for ; Fri, 30 Sep 2016 02:33:33 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH 3/5] thread: pass array refs instead of entire arrays Date: Fri, 30 Sep 2016 02:33:21 +0000 Message-Id: <20160930023323.3323-4-e@80x24.org> In-Reply-To: <20160930023323.3323-1-e@80x24.org> References: <20160930023323.3323-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 f503d99..3c3d353 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -864,10 +864,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