On Wed 02 Oct 2002 22:11, Michael G Schwern <[EMAIL PROTECTED]> wrote:
> On Wed, Oct 02, 2002 at 01:50:56PM +0200, H.Merijn Brand wrote:
> >  SYNOPSIS
> >         use Devel::Internals;
> 
> A little broad.  Perhaps Devel::Memory?

My intent was to gather more internal states. Whatever useful.

> >         my $end = sbrk ();
> > 
> >         my @array = (1..10000);
> >         print "The creation of this array used ",
> >             sbrk () - $end, "bytes\n";
> > 
> >         # Easier
> >         use Devel::Internals;
> > 
> >         my @array = (1..10000);
> >         MemUsed "creation of array";
> > 
> >         my @dup = @array;
> >         MemUsed "duplication of array";
> > 
> >  DESCRIPTION
> >       sbrk
> >           returns the current memory top. See sbrk(2) manual page
> 
> I realize that sbrk() is a familiar concept to deep C programmers on
> BSD-style systems, but in order for this to be useful to Perl programmers,
> or even users not familiar with BSD, you're going to have to name it
> something more descriptive than sbrk() and explain better what it does.

That's why there /is/ an Internals.pm: to hide the gory details and
implementation specifics to the user.

> It can still do the same thing as sbrk(), and you might even want to leave
> in an alias to sbrk() so BSD core hackers can feel all warm and fuzzy.
> 
> 
> >       MemUsed ($msg)
> >           Used in void context reports the number of bytes used since the
> >           previous call to MemUsed with the message passed
> 
> Global state is a Bad Thing.  Consider when you have two different,

But having only /one/ interpeter, it *is* a global state. Nothing you can do
about it.

> unrelated subroutines both calling MemUsed() in the same program.  foo()
> calls MemUsed() then bar() then foo() calls MemUsed() again expecting to get
> the memory used since it's last call but it's actually getting the memory
> used since bar() last called it.

Bad luck. we don't have any tool to separate.

> If you're going to keep state like this, better just have an object to
> represent various views on the memory state.

No way. This was meant to be a *low* level interface to help you find memory
hogs and other possible snakes. I see no use whatsoever in any production
environment. That's why I went for Devel:: namespace

> I can see two interfaces for this, possibly parallel.  One is similar to
> your MemUsed() except the state is stored perl object.  It simply returns
> the memory used since the last check on that object.
> 
>         package A;
>         my $mem_state = Devel::Memory->new;
> 
>           sub foo {
>             printf "%d has been used since the last call to foo()\n",
>                    $mem_state->used_since_last;
>         }
> 
> The other one allows you to more easily track the memory usage of a block of
> code by saying "track from this point to this point".  Here's an example of
> tracking the memory used inside a subroutine.
> 
>         # meanwhile, in another file
>         package B;
>         my $mem_state = Devel::Memory->new;
> 
>           sub bar {
>             $mem_state->start;
>             ...do some stuff...
>             printf "%d was used inside bar()\n", $mem_state->stop;
>         }
> 
> For convinence, stop() returns the amount of memory used so you can do it in
> two steps (start, stop/report) rather than three (start, stop, report).
> 
> The other nice part about having an object is you can then hang lots of
> methods off it without polluting the caller's namespace.  So you can have
> your methods which print neatly formatted diagnostics seperate from your
> methods which simply return values.
> 
> 
> >           Used in scalar context returns the current sbrk value
> 
> Shouldn't sbrk() do that?  Is this the same value as MemUsed() would print
> in void context?

Complaints enough already about sbrk (). MemUsed () should hide the
implementation. That's why.

MemUsed ("blah"); # void context

should print a message to STDERR

while

my $mem = MemUsed ("now");      # Scalar context

should print nothing, but return the sbrk value, hiding the sbrk call to the
user, but still putting it on the history stack.

> >           Used in list context returns the values saved on every call
> 
> ?

See another answer in this thread proposing to return a list of lists. I like
that.

-- 
H.Merijn Brand        Amsterdam Perl Mongers (http://amsterdam.pm.org/)
using perl-5.6.1, 5.8.0 & 633 on HP-UX 10.20 & 11.00, AIX 4.2, AIX 4.3,
  WinNT 4, Win2K pro & WinCE 2.11.  Smoking perl CORE: [EMAIL PROTECTED]
http:[EMAIL PROTECTED]/   [EMAIL PROTECTED]
send smoke reports to: [EMAIL PROTECTED], QA: http://qa.perl.org


Reply via email to