我之前在Perl中编写了一些实用程序,我现在正在重写它们以提供一些新的/更好的功能。然而,事情似乎比原始实用程序要慢得多,因此我决定使用NYTProf分析器运行一个。伟大的探测器顺便说一句,仍然试图弄清楚它的所有有用功能。
所以无论如何,事实证明,我的程序时间的93%用于调用GeneModel::CORE:match (opcode)
子程序,而我没有知道这是什么。大多数Google点击其他人发布的NYTProf个人资料。我确实编写了GeneModel
类/包,但我不知道这个子程序是什么,为什么它被调用了这么多次,或者为什么它需要这么长时间。有什么想法吗?
答案 0 :(得分:13)
CORE:match
是对正则表达式的调用 - 在这种情况下,是在GeneModel
包中。
例如,如果我们对此脚本进行了分析,则Devel::NYTProf会向Foo::CORE:match
报告1000次调用。
use strict;
use warnings;
package Foo;
my $s = 'foo foo';
$s =~ /foo/ for 1 .. 1000;
答案 1 :(得分:7)
Perl被编译为操作码。 m
atch operator会产生匹配操作码。
> perl -MO=Terse -e'm//'
LISTOP (0x8c4b40) leave [1]
OP (0x8c4070) enter
COP (0x8c4780) nextstate
PMOP (0x8c4260) match
这不是一个子程序,只是表示这种方式,因为操作码分析是最近添加的,并且UI尚未进行彻底检查以将其考虑在内。简单来说,分析器告诉您大部分时间花在正则表达式引擎上。