Mercurial > pub > Impl
comparison Lib/IMPL/Profiler/Memory.pm @ 0:03e58a454b20
Создан репозитарий
| author | Sergey |
|---|---|
| date | Tue, 14 Jul 2009 12:54:37 +0400 |
| parents | |
| children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:03e58a454b20 |
|---|---|
| 1 package IMPL::Profiler::Memory; | |
| 2 | |
| 3 use strict; | |
| 4 use Carp qw(longmess shortmess); | |
| 5 use Scalar::Util qw(refaddr weaken isweak); | |
| 6 | |
| 7 my %instances; | |
| 8 | |
| 9 BEGIN { | |
| 10 *CORE::GLOBAL::bless = sub { | |
| 11 $_[1] |= caller unless $_[1]; | |
| 12 my $ref = CORE::bless $_[0],$_[1]; | |
| 13 | |
| 14 my $id = refaddr($ref); | |
| 15 | |
| 16 $instances{$id} = { | |
| 17 Class => $_[1], | |
| 18 WeakRef => $ref | |
| 19 }; | |
| 20 | |
| 21 weaken($instances{$id}{WeakRef}); | |
| 22 | |
| 23 return $ref; | |
| 24 } | |
| 25 } | |
| 26 | |
| 27 sub DumpAlive { | |
| 28 my ($hout) = @_; | |
| 29 $hout = *STDOUT unless $hout; | |
| 30 print $hout "Alive objects table\n"; | |
| 31 print $hout "-------------------\n"; | |
| 32 while (my ($id,$info) = each %instances) { | |
| 33 delete $instances{$id} and next unless $info->{WeakRef}; | |
| 34 print "$info->{Class} $id: $info->{WeakRef}\n"; | |
| 35 } | |
| 36 } | |
| 37 | |
| 38 sub StatClasses { | |
| 39 my ($hout) = @_; | |
| 40 $hout = *STDOUT unless $hout; | |
| 41 print $hout "Statistics by class\n"; | |
| 42 print $hout "-------------------\n"; | |
| 43 my %stat; | |
| 44 while (my ($id,$info) = each %instances) { | |
| 45 #$stat{$info->{Class}}{total} ++; | |
| 46 delete $instances{$id} and next unless $info->{WeakRef}; | |
| 47 $stat{$info->{Class}}{alive} ++; | |
| 48 } | |
| 49 | |
| 50 print $hout "$_ $stat{$_}{alive} \n" foreach sort keys %stat; | |
| 51 } | |
| 52 | |
| 53 sub Clear { | |
| 54 undef %instances; | |
| 55 } | |
| 56 | |
| 57 1; |
