[Israel.pm] preallocation of hash buckets or arrays
Yona Shlomo
yona at cs.technion.ac.il
Sat Mar 12 21:54:56 PST 2005
On Sun, 13 Mar 2005 Yossi.Itzkovich at ecitele.com wrote:
> In YAPC::Israel::2003book I saw that Shlomo gave an example of
> preallocation of hash buckets:
>
> keys my %cache =@in;
>
> my questions:
> 1) I always thought that keys() returns a copy of the hash' keys. According
> to the code above, itlooks like you can set the lnternal keys list. As it
> true ?
>From `perldoc -f keys`:
As an lvalue "keys" allows you to increase the number of hash
buckets allocated for the given hash. This can gain you a mea-
sure of efficiency if you know the hash is going to get big.
(This is similar to pre-extending an array by assigning a
larger number to $#array.) If you say
keys %hash = 200;
then %hash will have at least 200 buckets allocated for it--256
of them, in fact, since it rounds up to the next power of two.
These buckets will be retained even if you do "%hash = ()", use
"undef %hash" if you want to free the storage while %hash is
still in scope. You can't shrink the number of buckets allo-
cated for the hash using "keys" in this way (but you needn't
worry about doing this by accident, as trying has no effect).
> 2) Does this trick work with normal arrays too ? What is the syntax
> (assuming I don't have such @in list as in the code above) ?
I can't recall anything but actually assignning to the list.
> 3) Is there any disadvantage of using this trick, assuming I know the
> minimal size of the hash/array ?
As it rounds the number of buckets to the next power of two,
if you need only 2^N+1 buckets, you will end up with 2^(N+1)
buckets allocated. This becomes worse and worse as N grows.
I don't remember what's the growth pattern for hashes
otherwise (i.e. not during initialization). Most probably,
other mongers can fill in the blanks.
--
Shlomo Yona
yona at cs.haifa.ac.il
http://yeda.cs.technion.ac.il/~yona/
More information about the Perl
mailing list