← Index
NYTProf Performance Profile   « line view »
For examples/Atom-timer.pl
  Run on Mon Aug 12 14:45:28 2013
Reported on Mon Aug 12 14:46:14 2013

Filename/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/darwin-thread-multi-2level/Class/MOP/Method/Meta.pm
StatementsExecuted 1035 statements in 6.40ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
55224.08ms20.3msClass::MOP::Method::Meta::::wrapClass::MOP::Method::Meta::wrap
5511275µs306µsClass::MOP::Method::Meta::::_generate_meta_methodClass::MOP::Method::Meta::_generate_meta_method
1117µs7µsClass::MOP::Method::Meta::::BEGIN@3Class::MOP::Method::Meta::BEGIN@3
1116µs1.47msClass::MOP::Method::Meta::::BEGIN@18Class::MOP::Method::Meta::BEGIN@18
1115µs29µsClass::MOP::Method::Meta::::BEGIN@16Class::MOP::Method::Meta::BEGIN@16
1115µs26µsClass::MOP::Method::Meta::::BEGIN@14Class::MOP::Method::Meta::BEGIN@14
1115µs15µsClass::MOP::Method::Meta::::BEGIN@10Class::MOP::Method::Meta::BEGIN@10
1115µs8µsClass::MOP::Method::Meta::::BEGIN@11Class::MOP::Method::Meta::BEGIN@11
1115µs25µsClass::MOP::Method::Meta::::BEGIN@13Class::MOP::Method::Meta::BEGIN@13
0000s0sClass::MOP::Method::Meta::::__ANON__[:49]Class::MOP::Method::Meta::__ANON__[:49]
0000s0sClass::MOP::Method::Meta::::_is_caller_mop_internalClass::MOP::Method::Meta::_is_caller_mop_internal
0000s0sClass::MOP::Method::Meta::::_make_compatible_withClass::MOP::Method::Meta::_make_compatible_with
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1
2package Class::MOP::Method::Meta;
3
# spent 7µs within Class::MOP::Method::Meta::BEGIN@3 which was called: # once (7µs+0s) by Class::MOP::Mixin::HasMethods::BEGIN@12 at line 5
BEGIN {
417µs $Class::MOP::Method::Meta::AUTHORITY = 'cpan:STEVAN';
5129µs17µs}
# spent 7µs making 1 call to Class::MOP::Method::Meta::BEGIN@3
6{
72800ns $Class::MOP::Method::Meta::VERSION = '2.1005';
8}
9
10218µs224µs
# spent 15µs (5+10) within Class::MOP::Method::Meta::BEGIN@10 which was called: # once (5µs+10µs) by Class::MOP::Mixin::HasMethods::BEGIN@12 at line 10
use strict;
# spent 15µs making 1 call to Class::MOP::Method::Meta::BEGIN@10 # spent 10µs making 1 call to strict::import
11219µs211µs
# spent 8µs (5+3) within Class::MOP::Method::Meta::BEGIN@11 which was called: # once (5µs+3µs) by Class::MOP::Mixin::HasMethods::BEGIN@12 at line 11
use warnings;
# spent 8µs making 1 call to Class::MOP::Method::Meta::BEGIN@11 # spent 3µs making 1 call to warnings::import
12
13221µs245µs
# spent 25µs (5+20) within Class::MOP::Method::Meta::BEGIN@13 which was called: # once (5µs+20µs) by Class::MOP::Mixin::HasMethods::BEGIN@12 at line 13
use Carp 'confess';
# spent 25µs making 1 call to Class::MOP::Method::Meta::BEGIN@13 # spent 20µs making 1 call to Exporter::import
14229µs248µs
# spent 26µs (5+21) within Class::MOP::Method::Meta::BEGIN@14 which was called: # once (5µs+21µs) by Class::MOP::Mixin::HasMethods::BEGIN@12 at line 14
use Scalar::Util 'blessed', 'weaken';
# spent 26µs making 1 call to Class::MOP::Method::Meta::BEGIN@14 # spent 21µs making 1 call to Exporter::import
15
16222µs253µs
# spent 29µs (5+24) within Class::MOP::Method::Meta::BEGIN@16 which was called: # once (5µs+24µs) by Class::MOP::Mixin::HasMethods::BEGIN@12 at line 16
use constant DEBUG_NO_META => $ENV{DEBUG_NO_META} ? 1 : 0;
# spent 29µs making 1 call to Class::MOP::Method::Meta::BEGIN@16 # spent 24µs making 1 call to constant::import
17
182249µs22.93ms
# spent 1.47ms (6µs+1.46) within Class::MOP::Method::Meta::BEGIN@18 which was called: # once (6µs+1.46ms) by Class::MOP::Mixin::HasMethods::BEGIN@12 at line 18
use base 'Class::MOP::Method';
# spent 1.47ms making 1 call to Class::MOP::Method::Meta::BEGIN@18 # spent 1.46ms making 1 call to base::import
19
20sub _is_caller_mop_internal {
21 my $self = shift;
22 my ($caller) = @_;
23 return $caller =~ /^(?:Class::MOP|metaclass)(?:::|$)/;
24}
25
26
# spent 306µs (275+31) within Class::MOP::Method::Meta::_generate_meta_method which was called 55 times, avg 6µs/call: # 55 times (275µs+31µs) by Class::MOP::Method::Meta::wrap at line 61, avg 6µs/call
sub _generate_meta_method {
275512µs my $method_self = shift;
28557µs my $metaclass = shift;
2955102µs5531µs weaken($metaclass);
# spent 31µs making 55 calls to Scalar::Util::weaken, avg 560ns/call
30
31 sub {
32 # this will be compiled out if the env var wasn't set
33 if (DEBUG_NO_META) {
34 confess "'meta' method called by MOP internals"
35 # it's okay to call meta methods on metaclasses, since we
36 # explicitly ask for them
37 if !$_[0]->isa('Class::MOP::Object')
38 && !$_[0]->isa('Class::MOP::Mixin')
39 # it's okay if the test itself calls ->meta, we only care about
40 # if the mop internals call ->meta
41 && $method_self->_is_caller_mop_internal(scalar caller);
42 }
43 # we must re-initialize so that it
44 # works as expected in subclasses,
45 # since metaclass instances are
46 # singletons, this is not really a
47 # big deal anyway.
484141.70ms8284.64ms $metaclass->initialize(blessed($_[0]) || $_[0])
# spent 4.50ms making 414 calls to Class::MOP::Class::initialize, avg 11µs/call, recursion: max depth 1, sum of overlapping time 49µs # spent 186µs making 414 calls to Scalar::Util::blessed, avg 448ns/call
49553.67ms };
50}
51
52
# spent 20.3ms (4.08+16.2) within Class::MOP::Method::Meta::wrap which was called 55 times, avg 369µs/call: # 32 times (3.82ms+9.96ms) by Moose::Meta::Method::Meta::wrap at line 26 of Moose/Meta/Method/Meta.pm, avg 431µs/call # 23 times (266µs+6.25ms) by Class::MOP::Mixin::HasMethods::_add_meta_method at line 33 of Class/MOP/Mixin/HasMethods.pm, avg 283µs/call
sub wrap {
535561µs my ($class, @args) = @_;
54
555523µs unshift @args, 'body' if @args % 2 == 1;
565561µs my %params = @args;
57559µs confess "Overriding the body of meta methods is not allowed"
58 if $params{body};
59
605562µs55454µs my $metaclass_class = $params{associated_metaclass}->meta;
# spent 287µs making 36 calls to Class::MOP::Object::meta, avg 8µs/call # spent 167µs making 19 calls to Moose::Meta::Role::meta, avg 9µs/call
615580µs55306µs $params{body} = $class->_generate_meta_method($metaclass_class);
# spent 306µs making 55 calls to Class::MOP::Method::Meta::_generate_meta_method, avg 6µs/call
6255219µs5515.5ms return $class->SUPER::wrap(%params);
# spent 15.5ms making 55 calls to Class::MOP::Method::wrap, avg 281µs/call
63}
64
65sub _make_compatible_with {
66 my $self = shift;
67 my ($other) = @_;
68
69 # XXX: this is pretty gross. the issue here is that CMOP::Method::Meta
70 # objects are subclasses of CMOP::Method, but when we get to moose, they'll
71 # need to be compatible with Moose::Meta::Method, which isn't possible. the
72 # right solution here is to make ::Meta into a role that gets applied to
73 # whatever the method_metaclass happens to be and get rid of
74 # _meta_method_metaclass entirely, but that's not going to happen until
75 # we ditch cmop and get roles into the bootstrapping, so. i'm not
76 # maintaining the previous behavior of turning them into instances of the
77 # new method_metaclass because that's equally broken, and at least this way
78 # any issues will at least be detectable and potentially fixable. -doy
79 return $self unless $other->_is_compatible_with($self->_real_ref_name);
80
81 return $self->SUPER::_make_compatible_with(@_);
82}
83
8412µs1;
85
86# ABSTRACT: Method Meta Object for C<meta> methods
87
88__END__