in reply to Re: Re: Weighting rand()
in thread Weighting rand()

Actually, it probably doesn't save any memory either.

The size of a scalar has a minimum overhead. Anything below about 20 characters (guess) in length requires the same amount of memory, so the fact that the integers appear smaller than the string will have negligable savings.

Worse, doing it my way requires a (short lived) second array (list) to be built, which will consume almost as much memory as the original array, thereby doubling the consumption breifly.

Overall, your method is probably better for the reasons of simplified maintanence. The only change I would make to yours is that I would use the x operator in the initialisation rather than iterated pushes.

my @mirrors = ( ('http://foo.mirror.org') x 3, ('http://www.users-domain.com/proj/foo') x 2, ('http://osdn.dl.sf.net/sourceforge/foo') x 3, ('http://unc.dl.sf.net/sourceforge/foo') x 4, ('http://umn.dl.sf.net/sourceforge/foo') x 4, ('http://heanet.dl.sf.net/sourceforge/foo') x 5, ('http://aleron.dl.sf.net/sourceforge/foo') x 5, );

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail

Replies are listed 'Best First'.
Re: Weighting rand()
by Abigail-II (Bishop) on May 25, 2004 at 09:10 UTC
    If your intention is to save memory, you can avoid the duplication, at the cost of more run time:
    my %mirror = ( 'http://foo.mirror.org' => 3, 'http://www.users-domain.com/proj/foo' => 2, 'http://osdn.dl.sf.net/sourceforge/foo' => 3, 'http://unc.dl.sf.net/sourceforge/foo' => 4, 'http://umn.dl.sf.net/sourceforge/foo' => 4, 'http://heanet.dl.sf.net/sourceforge/foo' => 5, 'http://aleron.dl.sf.net/sourceforge/foo' => 5, ); my $t = 0; my $choice; while (my ($url, $n) = each %mirror) { $choice = $url if rand ($t += $n) < $n }
    Of course, in real code, this is only worthwhile if your numbers are high, and the number of mirrors isn't.

    Abigail

Re: Re: Re: Re: Weighting rand()
by dave_the_m (Monsignor) on May 25, 2004 at 10:46 UTC
    The size of a scalar has a minimum overhead. Anything below about 20 characters (guess) in length requires the same amount of memory
    Er, no. A scalar that is only ever used as a number will use less memory than a scalar used as a string (even one of zero length).
    $ perl -e 'push @a, 1 for 1..100000; system"ps -flp $$"' .... SZ .... 608 $ perl -e 'push @a, "" for 1..100000; system"ps -flp $$"' .... SZ .... 905

      Even so, there is still an overhead of 24 bytes per element of the array before you put anything in it. If you have to create a second array (list) to hold the indexes, the weightings have to be pretty large for the savings in replicating the indexes rather than the strings, to balance out the cost of creating that second list.


      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "Think for yourself!" - Abigail