Sto cercando di analizzare un file XML di grandi dimensioni. L'ho letto utilizzando XML :: SAX (utilizzando Expat, non l'implementazione Perl) e mettere tutto il secondo livello e al di sotto nodi nel mio "nodo" di classe:Perché il codice Moose è così lento?
package Node;
use Moose;
has "name" =>
(
isa => "Str",
reader => 'getName'
);
has "text" =>
(
is => "rw",
isa => "Str"
);
has "attrs" =>
(
is => "rw",
isa => "HashRef[Str]"
);
has "subNodes" =>
(
is => "rw",
isa => "ArrayRef[Node]",
default => sub { [] }
);
sub subNode
{
my ($self, $name) = @_;
my $subNodeRef = $self->subNodes;
my @matchingSubnodes = grep { $_->getName eq $name } @$subNodeRef;
if (scalar(@matchingSubnodes) == 1)
{
return $matchingSubnodes[0];
}
return undef;
}
1;
Nel sottomenu "end_element", verifico se questo è un nodo che mi interessa, e se lo è, faccio qualche ulteriore elaborazione.
Questo ha funzionato correttamente sui miei file di test, ma l'altro ieri l'ho lanciato sul mio file reale, tutti i 13 milioni di righe di esso, e richiede sempre. Funziona da oltre 36 ore. Come faccio a sapere se è Moose o XML :: SAX che è il collo di bottiglia? Moose è sempre lento, o lo sto usando male?
Aggiornamento Facendo un profilo su una linea di 20.000 sottoinsieme dei dati mostra che si tratta di Moose che è il collo di bottiglia - in particolare nella classe :: :: MOP Class :: compute_all_applicable_attributes (13,9%) e altri di classe e le classi Moose.
L'alce può sembrare lento, ma non farlo arrabbiare ... –
'Classe :: MOP :: Class :: compute_all_applicable_attributes' è qualcosa che deve essere fatto molto se non si' __PACKAGE __-> meta -> make_immutable' le tue lezioni come ho suggerito nella mia risposta. Come cambia il profilo se lo fai? – rafl
@Ether, quello riguardava il costo di avvio. Il mio riguarda i costi di gestione, in particolare la creazione e distruzione di oggetti. –