Что такое подпрограмма CORE: match (opcode) в профилировании Perl? - PullRequest
4 голосов
/ 26 октября 2010

Ранее я писал некоторые утилиты на Perl, и сейчас я переписываю их, чтобы дать некоторые новые / лучшие функции. Однако, кажется, что все идет намного медленнее, чем в оригинальных утилитах, поэтому я решил запустить один с профайлером NYTProf. Между прочим, отличный профилировщик, все еще пытающийся выяснить все его полезные функции.

Так или иначе, оказывается, что 93% времени моей программы тратится на вызовы подпрограммы GeneModel::CORE:match (opcode), и у меня есть нет понятия, что это такое. Большинство посещений Google указывают на профили NYTProf, опубликованные другими пользователями. Я действительно написал класс / пакет GeneModel, но я не знаю, что это за подпрограмма, почему она так часто вызывается или почему она так долго. Есть идеи?

Ответы [ 2 ]

13 голосов
/ 26 октября 2010

CORE:match - это вызов регулярного выражения - в данном случае, внутри вашего пакета GeneModel.

Например, если мы профилируем этот скрипт, Devel :: NYTProf сообщает о 1000 вызовах Foo::CORE:match.

use strict;
use warnings;

package Foo;
my $s = 'foo foo';
$s =~ /foo/ for 1 .. 1000;
7 голосов
/ 26 октября 2010

Perl компилируется в коды операций. Оператор m atch приводит к совпадению кода операции.

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

Это не подпрограмма, а просто представленная таким образом, поскольку профилирование кода операции является недавним дополнением, и пользовательский интерфейс еще не пересматривался, чтобы учесть это. Проще говоря, профилировщик говорит вам, что большая часть времени проводится в движке регулярных выражений.

...