Mercurial > pub > Impl
comparison Lib/IMPL/Profiler.pm @ 194:4d0e1962161c
Replaced tabs with spaces
IMPL::Web::View - fixed document model, new features (control classes, document constructor parameters)
author | cin |
---|---|
date | Tue, 10 Apr 2012 20:08:29 +0400 |
parents | 44977efed303 |
children | c8fe3f84feba |
comparison
equal
deleted
inserted
replaced
193:8e8401c0aea4 | 194:4d0e1962161c |
---|---|
17 $level = 0; | 17 $level = 0; |
18 if ($Enabled) { | 18 if ($Enabled) { |
19 warn "profiler enabled"; | 19 warn "profiler enabled"; |
20 | 20 |
21 unshift @INC, sub { | 21 unshift @INC, sub { |
22 my ($self,$filename) = @_; | 22 my ($self,$filename) = @_; |
23 | 23 |
24 (my $module = $filename) =~ s/\//::/g; | 24 (my $module = $filename) =~ s/\//::/g; |
25 $module =~ s/\.\w+$//; | 25 $module =~ s/\.\w+$//; |
26 | 26 |
27 return unless $module =~ $Filter; | 27 return unless $module =~ $Filter; |
28 | 28 |
29 foreach my $dir (@INC) { | 29 foreach my $dir (@INC) { |
30 my $fullName = "$dir/$filename"; | 30 my $fullName = "$dir/$filename"; |
31 if (-f $fullName) { | 31 if (-f $fullName) { |
32 open my $hmod, $fullName or die "$fullName: $!" if $!; | 32 open my $hmod, $fullName or die "$fullName: $!" if $!; |
33 | 33 |
34 | 34 |
35 | 35 |
36 my @source; | 36 my @source; |
37 local $/ = "\n"; | 37 local $/ = "\n"; |
38 while (my $line = <$hmod>) { | 38 while (my $line = <$hmod>) { |
39 last if $line =~ /^\s*__END__/; | 39 last if $line =~ /^\s*__END__/; |
40 push @source, $line; | 40 push @source, $line; |
41 } | 41 } |
42 | 42 |
43 undef $hmod; | 43 undef $hmod; |
44 | 44 |
45 push @source, | 45 push @source, |
46 "IMPL::Profiler::trap_all(__PACKAGE__);\n", | 46 "IMPL::Profiler::trap_all(__PACKAGE__);\n", |
47 "1;\n"; | 47 "1;\n"; |
48 | 48 |
49 | 49 |
50 return (sub { | 50 return (sub { |
51 if (@source) { | 51 if (@source) { |
52 $_ = shift @source; | 52 $_ = shift @source; |
53 return 1; | 53 return 1; |
54 } else { | 54 } else { |
55 return 0; | 55 return 0; |
56 } | 56 } |
57 }, undef ); | 57 }, undef ); |
58 } | 58 } |
59 } | 59 } |
60 }; | 60 }; |
61 | 61 |
62 no warnings 'once'; | 62 no warnings 'once'; |
63 *CORE::GLOBAL::caller = sub { | 63 *CORE::GLOBAL::caller = sub { |
64 my $target = (shift || 0)+1; | 64 my $target = (shift || 0)+1; |
65 my $realFrame = 1; | 65 my $realFrame = 1; |
111 | 111 |
112 if (defined $proto and not $proto) { | 112 if (defined $proto and not $proto) { |
113 return; | 113 return; |
114 } | 114 } |
115 { | 115 { |
116 package IMPL::Profiler::Proxy; | 116 package IMPL::Profiler::Proxy; |
117 no warnings 'redefine'; | 117 no warnings 'redefine'; |
118 my $sub = sub { | 118 my $sub = sub { |
119 my $t0 = [Time::HiRes::gettimeofday]; | 119 my $t0 = [Time::HiRes::gettimeofday]; |
120 my @arr; | 120 my @arr; |
121 my $scalar; | 121 my $scalar; |
122 my $entry = $prevCode; | 122 my $entry = $prevCode; |
123 my ($timeOwn,$timeTotal); | 123 my ($timeOwn,$timeTotal); |
124 my $context = wantarray; | 124 my $context = wantarray; |
125 { | 125 { |
126 local $InvokeTime = 0; | 126 local $InvokeTime = 0; |
127 #warn "\t"x$level,"enter ${class}::$method"; | 127 #warn "\t"x$level,"enter ${class}::$method"; |
128 $level ++; | 128 $level ++; |
129 if ($context) { | 129 if ($context) { |
130 @arr = &$entry(@_); | 130 @arr = &$entry(@_); |
131 } else { | 131 } else { |
132 if (defined $context) { | 132 if (defined $context) { |
133 $scalar = &$entry(@_); | 133 $scalar = &$entry(@_); |
134 } else { | 134 } else { |
135 &$entry(@_); | 135 &$entry(@_); |
136 } | 136 } |
137 } | 137 } |
138 $timeTotal = Time::HiRes::tv_interval($t0); | 138 $timeTotal = Time::HiRes::tv_interval($t0); |
139 $timeOwn = $timeTotal - $InvokeTime; | 139 $timeOwn = $timeTotal - $InvokeTime; |
140 } | 140 } |
141 $InvokeInfo{"${class}::${method}"}{Count} ++; | 141 $InvokeInfo{"${class}::${method}"}{Count} ++; |
142 $InvokeInfo{"${class}::${method}"}{Total} += $timeTotal; | 142 $InvokeInfo{"${class}::${method}"}{Total} += $timeTotal; |
143 $InvokeInfo{"${class}::${method}"}{Own} += $timeOwn; | 143 $InvokeInfo{"${class}::${method}"}{Own} += $timeOwn; |
144 $InvokeTime += $timeTotal; | 144 $InvokeTime += $timeTotal; |
145 $level --; | 145 $level --; |
146 #warn "\t"x$level,"leave ${class}::$method"; | 146 #warn "\t"x$level,"leave ${class}::$method"; |
147 return $context ? @arr : $scalar; | 147 return $context ? @arr : $scalar; |
148 }; | 148 }; |
149 if ($proto) { | 149 if ($proto) { |
150 Scalar::Util::set_prototype($sub => $proto); | 150 Scalar::Util::set_prototype($sub => $proto); |
151 } | 151 } |
152 *{"${class}::${method}"} = $sub; | 152 *{"${class}::${method}"} = $sub; |
153 } | 153 } |
154 | 154 |
155 } | 155 } |
156 | 156 |
157 sub PrintStatistics { | 157 sub PrintStatistics { |