Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Is it worth the reference?

by meonkeys (Chaplain)
on Sep 20, 2000 at 01:05 UTC ( [id://33201]=perlquestion: print w/replies, xml ) Need Help??

meonkeys has asked for the wisdom of the Perl Monks concerning the following question:

Newbie (to references) question:
Am I saving any memory/time/etc by using an array reference rather than accessing the array directly? What are the benefits of using the reference?

#!/usr/bin/perl -w use strict; my @list = ( { name => "cm_lg_port", description => "Full Page", dimensions => "8.5 x 11 inches", layout => "portrait", weight => "251k", }, { name => "cm_sm_port", description => "Half Page", dimensions => "5.5 x 8.5 inches", layout => "portrait", weight => "217k", }, { name => "cm_sm_land", description => "Half Page", dimensions => "8.5 x 5.5 inches", layout => "landscape", weight => "207k", } ); my $arrayref = \@list; foreach my $file (@$arrayref) { print $file->{name}; print $file->{description}; print $file->{dimensions}; print $file->{layout}; print $file->{weight}; }

Replies are listed 'Best First'.
Re: Is it worth the reference?
by japhy (Canon) on Sep 20, 2000 at 01:15 UTC
    It's not useful here. It would be useful if you want to pass the data structure to a function. Passing a reference to the array, instead of the array itself, takes far less memory.

    $_="goto+F.print+chop;\n=yhpaj";F1:eval
Re: Is it worth the reference?
by chromatic (Archbishop) on Sep 20, 2000 at 02:45 UTC
    This will actually be (a little) slower, because you're going through another level of indirection. As japhy and TGI have already pointed out, copying a large data structure to the stack for a subroutine is often more expensive.

    What you gain in this case is nothing. You're also using a few bytes more memory in your snippet than you would be using without the reference -- just not enough to count.

    However, when you want to pass two arrays into a function, you'll be very glad you know how to take a reference to an array.

    In general, unless you need to use them, don't.

      In general, unless you need to use [array references[]], don't.
      I wouldn't necessarily go that far.

      In this instance, no, the array ref is not worth it, I'll admit, but notice nobody criticised his use of hash references.

      The key guide meonkeys should use to decide between arrays and array refs is: Does the use of one over the other make the program easier to read, write, and understand?

      If using array refs make the program easier to read, write, and understand, the savings from that will (usually) dwarf the extra time spent in the deref.

      (This is not a license to use them gratuitously, but rather to use them sensibly. I think the use in this snippit is obviously gratuitous (even to meonkeys).

      To answer meonkeys' final question (what are array refs good for?): Array refs are useful when it is necessary or convenient to treat an entire array as a single scalar:

      • storing an array into another array or hash
      • passing multiple arrays into subroutines while maintaining their distinct identity
      • when the array represents a single "unit" of data (such as a complex number stored as a 2-element array)
      • etc
      For the last, if your data is that complicated, it might be reasonable to start thinking of making an object out of it, and an array ref is one possibility for an implementation.

      When you just want an ordered collection of values, an array will probably be easier to understand and faster than the array ref. When you need to think of the contents of the array as "one thing", an array ref will probably be easier to understand.

      Just my 2 cents...

Re: Is it worth the reference?
by TGI (Parson) on Sep 20, 2000 at 01:24 UTC
    Each time you pass an array to a subroutine you make a copy of it. If you pass a reference, you don't. Hence for small arrays the is no huge difference, but if you are passing big arrays around, you really really want to use a reference.

    I'm not sure how it works with built-in functions, though. Someone with greater knowledge will have to clear that up.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (3)
As of 2024-04-20 02:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found