I stand corrected.
my %set;
my $how_many = 10_000_000;
for( my $i = 0; $i < $how_many; $i++ ) {
$set{$i} = undef;
}
print 'mem usage: ', my_mem(), "\n";
sub my_mem {
my ($proc_info)
= grep { $_->[2] == $$ } map { [ split ] } `ps l | tail -n +2`
+;
return $proc_info->[6];
}
__END__
mem usage: 1323312
Changing $set{$i}=undef to $set{$i}=1:
mem usage: 1402268
Using undef instead of 1, you save about 78M on ten million items—about a 6% difference. Or you could look at it as 8 bytes per item, unless I did my math wrong (which becomes more and more probable as time t approaches lunch).
When $set{$i}=10 (no chance of using sv_yes):
mem usage: 1402268
When $set{$i}='' (empty string):
mem usage: 1872484
And finally, Set::Light:
use Set::Light;
my $set = Set::Light->new();
my $how_many = 10_000_000;
for( my $i = 0; $i < $how_many; $i++ ) {
$set->insert( $i );
}
__END__
mem usage: 1127960
It beats them all! It beats the undef case by 195M. Note, however, that most of my tests ran in 20–25 seconds. The Set::Light test took much much longer—almost four minutes. I'm pretty sure all that time is spent in destruction, because the test reports its results fairly quickly and then takes a long time to exit.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.