【问题标题】:What is the CORE:match (opcode) subroutine in Perl profiling?Perl 分析中的 CORE:match (opcode) 子例程是什么?
【发布时间】:2023-04-07 20:12:01
【问题描述】:
我之前在 Perl 中编写了一些实用程序,现在我正在重写它们以提供一些新的/更好的功能。然而,事情似乎比原来的实用程序慢得多,所以我决定用 NYTProf 分析器运行一个。顺便说一句,很棒的分析器,仍在尝试找出所有有用的功能。
无论如何,我的程序 93% 的时间都花在了对 GeneModel::CORE:match (opcode) 子例程的调用上,而我不知道这是什么。大多数谷歌点击指向其他人发布的 NYTProf 个人资料。我确实写了GeneModel 类/包,但是我不知道这个子例程是什么,为什么它被调用了这么多次,或者为什么它需要这么长时间。有什么想法吗?
【问题讨论】:
标签:
perl
profiling
subroutine
【解决方案1】:
CORE:match 是对正则表达式的调用——在这种情况下,在您的 GeneModel 包中。
例如,如果我们分析此脚本,Devel::NYTProf 会报告对Foo::CORE:match 的 1000 次调用。
use strict;
use warnings;
package Foo;
my $s = 'foo foo';
$s =~ /foo/ for 1 .. 1000;
【解决方案2】:
Perl 被编译为操作码。 match operator 导致匹配操作码。
> perl -MO=Terse -e'm//'
LISTOP (0x8c4b40) leave [1]
OP (0x8c4070) enter
COP (0x8c4780) nextstate
PMOP (0x8c4260) match
这不是一个子例程,而只是以这种方式表示,因为操作码分析是最近添加的,并且 UI 尚未经过大修以考虑到这一点。简而言之,分析器告诉您大部分时间都花在了正则表达式引擎上。