首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Moose代码这么慢?

为什么Moose代码这么慢?
EN

Stack Overflow用户
提问于 2010-10-12 13:14:41
回答 3查看 1K关注 0票数 9

我正试图解析一个大型XML文件。我使用XML::SAX (使用Expat,而不是perl实现)读取它,并将所有第二级和以下节点放入"Node“类中:

代码语言:javascript
复制
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“子文件中,我检查这是否是我关心的一个节点,如果是,我会做一些进一步的处理。

这一切在我的测试文件上都很好,但是前天我把它扔到了我的真实文件中,所有的1300万行都是这样,而且要花费很长时间。它已经跑了超过36个小时了。如何判断是Moose还是XML::SAX --这是瓶颈?穆斯总是这么慢,还是我用错了?

对20,000行数据子集执行配置文件的Class::MOP::Class::compute_all_applicable_attributes Update显示,是Moose造成了瓶颈--特别是在 (13.9%)和其他类和Moose类中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-12 13:25:02

虽然Moose在启动时做了相当多的工作,有时看起来有点慢,但是它生成的代码,特别是属性访问器,通常比一般perl程序员所能编写的要快一些。因此,考虑到您的进程运行时间相当长,我怀疑Moose引起的任何开销是否相关。

然而,从您展示的代码中,我无法真正判断出您的瓶颈是什么,尽管我坚信它不是Moose。我还想指出的是,做__PACKAGE__->meta->make_immutable,说你是类,现在是“最终的”允许驼鹿做一些进一步的优化,但我仍然怀疑这是什么给你带来麻烦。

不如你拿一个更小的数据样本,这样你的程序就能在合理的时间内完成,然后在像Devel::NYTProf这样的分析器中看一看。这样就可以告诉您在程序中的具体时间是在哪里度过的,因此您可以对这些部分进行具体优化,以获得最大的收益。

一种可能是,您使用的类型约束非常慢。实际上,在对每个实例的写访问(或类实例化)上彻底验证实例属性并不是大多数程序员通常会做的事情。如果您对数据的有效性有足够的肯定,可以尝试使用更简单的约束,例如ArrayRef而不是ArrayRef[Node]。这样,只会检查属性值本身的类型,而不是数组引用中每个元素的值。

不过,还是要分析一下你的代码。别猜了。

票数 22
EN

Stack Overflow用户

发布于 2010-10-12 19:40:31

我非常怀疑你的速度问题不是在驼鹿身上,而是在内存分配和磁盘交换方面。即使不做->meta->make_immutable,基于20K子集的时间,您的脚本也应该在大约2小时(11* (13_000_000 /20_000)/ 60) == ~119 min)内完成。通过做->meta->make_immutable,它会将其削减到大约。65分钟左右。

尝试再次运行您的大脚本,看看您的内存和交换正在做什么,我怀疑您给您的磁盘一个可怕的打击。

票数 7
EN

Stack Overflow用户

发布于 2010-10-12 14:08:27

我已经成功地使用XML::树枝 745 an文件编写了大型XML处理应用程序,在一个合理大小的盒子上运行不到一个小时。

但是,正如其他用户已经提到的,您需要分析您的代码,以确定究竟是什么导致了问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3915062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档