Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Trouble getting size of list returned from sub

by ColonelPanic (Friar)
on Nov 26, 2012 at 10:34 UTC ( [id://1005608]=note: print w/replies, xml ) Need Help??


in reply to Trouble getting size of list returned from sub

Here is a solution that potentially uses less memory:
my $size = scalar map {1} big_list;

Explanation: All of the other options involve copying the return arguments into an array behind the scenes. This does not, instead creating an array with the same number of elements, but containing the value "1" for each element. This will use less memory if the the sub is returning a list of large items (such as long strings).

This would be worth trying if you have problems with high memory usage.

(To test this, see the sample code with memory usage test above)



When's the last time you used duct tape on a duct? --Larry Wall

Replies are listed 'Best First'.
Re^2: Trouble getting size of list returned from sub
by Anonymous Monk on Nov 26, 2012 at 11:17 UTC

    Actually they all do that, they copy the list to the "stack", its just that map introduces a scope, by the time it ends, perl has a chance to release the memory it used back to the OS -- an optimization

    For a long time map/grep in scalar/void context took double the memory than equivalent for loop, so depending on perl version memory usage will differ between these two lines

    warn scalar grep {1} foo(); my $count = 0; $count++ for foo(); warn $count ;

    wantarray is what you want to use if you want to be sure :)

      Actually, it is not a scoping issue. By that logic, this should also save memory:
      sub get_size { my @a = big_list(); return scalar @a } my $size = get_size();

      However, in a simple test, that uses the same memory as a global array that does the same thing.

      Perl, generally speaking, does not release memory back to the OS unless your system is running out of memory. The memory from lexical variables can be claimed and reused by Perl, but it doesn't go back to the OS.

      All of the other methods created an array in addition to what was copied on the stack. map only creates an array of 1s in addition to what was copied on the stack; thus it uses less memory (unless your original data is no bigger than integers, of course) (and yes, this was not always true in older versions of Perl).



      When's the last time you used duct tape on a duct? --Larry Wall

        Actually, it is not a scoping issue

        Sure it is

        By that logic, this should also save memory:

        No, you're copying the list, same as map used to do, even in void context, instead of merely aliasing it -- @_ is alias until you copy it, but you figured that out yourself in Re: Trouble getting size of list returned from sub

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1005608]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (9)
As of 2024-03-28 10:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found