Раньше я писал некоторые утилиты на Perl, а сейчас переписываю их, чтобы добавить новые / лучшие функции. Однако кажется, что дела идут намного медленнее, чем в исходных утилитах, поэтому я решил запустить одну из них с профилировщиком NYTProf. Кстати, отличный профилировщик, все еще пытаюсь разобраться во всех его полезных функциях.
Так или иначе, оказывается, что 93% времени моей программы тратится на вызовы подпрограммы GeneModel::CORE:match (opcode), и я понятия не имею, что это такое. Большинство обращений Google указывают на профили NYTProf, опубликованные другими. Я действительно написал GeneModel класс / пакет, но я не знаю, что это за подпрограмма, почему она вызывалась так много раз или почему это занимает так много времени. Любые идеи?
Ответ 1 · рейтинг 13 · FMc
CORE:match - это вызов регулярного выражения - в данном случае в вашем GeneModel пакете.
Например, если мы профилируем этот скрипт, Devel :: NYTProf сообщит о 1000 звонках на Foo::CORE:match .
use strict;
use warnings;
package Foo;
my $s = 'foo foo';
$s =~ /foo/ for 1 .. 1000;
Ответ 2 · рейтинг 7 · daxim
Perl скомпилирован по кодам операций. Оператор match приводит к совпадению кода операции.
> perl -MO=Terse -e'm//'
LISTOP (0x8c4b40) leave [1]
OP (0x8c4070) enter
COP (0x8c4780) nextstate
PMOP (0x8c4260) match
Это не подпрограмма, а просто представленная таким образом, поскольку профилирование кода операции является недавним дополнением, и пользовательский интерфейс еще не был переработан с учетом этого. Проще говоря, профилировщик сообщает вам, что большая часть времени тратится на движок регулярных выражений.