4

我之前在 Perl 中编写了一些实用程序,现在我正在重写它们以提供一些新的/更好的功能。然而,事情似乎比原来的实用程序慢得多,所以我决定用 NYTProf 分析器运行一个。顺便说一句,伟大的探查器,仍在试图找出所有有用的功能。

所以无论如何,事实证明我的程序 93% 的时间都花在了GeneModel::CORE:match (opcode)对子例程的调用上,我知道这是什么。大多数谷歌点击指向其他人发布的 NYTProf 个人资料。我确实编写了GeneModel类/包,但我不知道这个子例程是什么,为什么它被调用了这么多次,或者为什么它需要这么长时间。有任何想法吗?

4

2 回答 2

13

CORE:match是对正则表达式的调用——在这种情况下,在你的GeneModel包中。

例如,如果我们分析此脚本,Devel::NYTProf 会报告 1000 次调用Foo::CORE:match.

use strict;
use warnings;

package Foo;
my $s = 'foo foo';
$s =~ /foo/ for 1 .. 1000;
于 2010-10-26T12:13:50.893 回答
7

Perl 被编译为操作码。atchm运算符产生匹配操作码。

> perl -MO=Terse -e'm//'
LISTOP (0x8c4b40) leave [1]
    OP (0x8c4070) enter
    COP (0x8c4780) nextstate
    PMOP (0x8c4260) match

这不是一个子例程,而只是以这种方式表示,因为操作码分析是最近添加的,并且 UI 尚未经过大修以考虑到这一点。简而言之,分析器告诉您大部分时间都花在了正则表达式引擎上。

于 2010-10-26T12:15:35.860 回答