Почему код Moose такой медленный?

Я пытаюсь разобрать большой XML-файл. Я прочитал его с помощью XML :: SAX (используя Expat, а не реализацию perl) и поместил все узлы второго уровня и ниже в свой класс «Node»:

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;

В подпрограмме «end_element» я проверяю, является ли это узлом Я забочусь о нем, и если это так, я провожу дополнительную обработку.

Все это отлично работало с моими тестовыми файлами, но позавчера я бросил его в свой настоящий файл, все 13 миллионов его строк, и это заняло навсегда. Он работает более 36 часов. Как узнать, что является узким местом: Moose или XML :: SAX? Moose всегда такой медленный, или я неправильно его использую?

Обновление Создание профиля для подмножества данных в 20 000 строк показывает, что узким местом является Moose - особенно в Class :: MOP :: Class :: compute_all_applicable_attributes (13. 9%) и другие классы Class и Moose.

9
задан Paul Tomblin 12 October 2010 в 13:58
поделиться