* [PATCH 03/17] thread: pass array refs instead of entire arrays
2016-10-05 23:57 6% [PATCH 0/17] remove Mail::Thread dependency Eric Wong
@ 2016-10-05 23:57 7% ` Eric Wong
0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2016-10-05 23:57 UTC (permalink / raw)
To: meta
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
^ permalink raw reply related [relevance 7%]
* [PATCH 0/17] remove Mail::Thread dependency
@ 2016-10-05 23:57 6% Eric Wong
2016-10-05 23:57 7% ` [PATCH 03/17] thread: pass array refs instead of entire arrays Eric Wong
0 siblings, 1 reply; 2+ results
From: Eric Wong @ 2016-10-05 23:57 UTC (permalink / raw)
To: meta
This greatly reduces the amount of code we need to load while
reducing abstractions which slow us down and hurt memory use
when displaying gigantic threads.
More may be done and we may use SearchMsg directly for threading
in the future and obviate the need for the container
abstraction.
Eric Wong (17):
view: remove "subject dummy" references
thread: remove Mail::Thread dependency
thread: pass array refs instead of entire arrays
thread: remove accessor usage in internals
inbox: deal with ghost smsg
thread: remove Email::Abstract wrapping
thread: remove rootset accessor method
thread: simplify
thread: remove iterate_down
thread: avoid incrementing undefined value
thread: order_children no longer cares about depth
thread: inline and remove recurse_down logic
thread: fix sorting without topmost
thread: use hash + array instead of hand-rolled linked list
view: remove redundant children array in thread views
t/thread-cycle: test self-referential messages
thread: remove weaken dependency
INSTALL | 1 -
MANIFEST | 3 +-
Makefile.PL | 1 -
lib/PublicInbox/Inbox.pm | 2 +
lib/PublicInbox/SearchIdx.pm | 4 +-
lib/PublicInbox/SearchMsg.pm | 29 -------
lib/PublicInbox/SearchThread.pm | 147 +++++++++++++++++++++++++++++++++++
lib/PublicInbox/SearchView.pm | 15 ++--
lib/PublicInbox/Thread.pm | 86 ---------------------
lib/PublicInbox/View.pm | 165 ++++++++++++++++++----------------------
lib/PublicInbox/WWW.pm | 2 +-
t/plack.t | 3 +-
t/search.t | 7 +-
t/thread-cycle.t | 97 +++++++++++++++++++++++
14 files changed, 333 insertions(+), 229 deletions(-)
^ permalink raw reply [relevance 6%]
Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2016-10-05 23:57 6% [PATCH 0/17] remove Mail::Thread dependency Eric Wong
2016-10-05 23:57 7% ` [PATCH 03/17] thread: pass array refs instead of entire arrays Eric Wong
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).