On Tue, May 24, 2005 at 02:13:49PM -0400, Dave Gray wrote: > On 5/23/05, Peter Rabbitson <[EMAIL PROTECTED]> wrote: > > On Mon, May 23, 2005 at 01:40:08PM -0400, Zhenhai Duan wrote: > > > I tried hash (where the members of a group are joined with ":"), and hash > > > of hash. It happended that hash of hash is slower than single hash. > > > > > > Hash: > > > $groups{$g1} = "$member1:$member2"; > > > > > > Hash of hash > > > $groups{$g1}{$member1} = 1; > > > > > > Method 1 is faster, even I need to do a split to get the members. > > > > Can you post some code? Without it the above statement is not very credible > > to say the least. > > The 1D approach seems to be approximately 3 times as fast (on x86 > Linux). Anyone get different results? > > #!/usr/bin/perl > use strict; > use warnings; > > my @ra = ('a' .. 'z', 'A' .. 'Z'); > my ($seqlen, $hashsize) = (4, 70000); > > my (%oned, %twod) = ((),()); > my (@l1, @l2) = ((),()); > > $|++; > print "generating hashes"; > for my $i (1 .. $hashsize) { > my $key1 = join('', @ra[map(int(rand($#ra))+1, 1 .. $seqlen)]); > push @l1, $key1; > my $key2 = join('', @ra[map(int(rand($#ra))+1, 1 .. $seqlen)]); > push @l2, $key2; > $oned{"$key1:$key2"}++; > $twod{$key1}{$key2}++; > print '.' if not $i % int($hashsize/10); > } > print "!\n"; > > # baseline > my ($su, $ss) = times; > for (1 .. $hashsize) { } > my ($eu, $es) = times; > my ($tu, $ts) = ($eu - $su, $es - $ss); > my $tt = $tu + $ts; > printf "%20s %5.2f %5.2f %6.2f\n", 'base', $tu, $ts, $tt; > > # access test for 1d > ($su, $ss) = times; > for my $i (0 .. $hashsize-1) { > $oned{"$l1[$i]:$l2[$i]"}++ > } > ($eu, $es) = times; > ($tu, $ts) = ($eu - $su, $es - $ss); > $tt = $tu + $ts; > printf "%20s %5.2f %5.2f %6.2f\n", '1D', $tu, $ts, $tt; > > # access test for 2d > ($su, $ss) = times; > for my $i (0 .. $hashsize-1) { > $oned{$l1[$i]}{$l2[$i]}++
I think you should be operating on %twod here. > } > ($eu, $es) = times; > ($tu, $ts) = ($eu - $su, $es - $ss); > $tt = $tu + $ts; > printf "%20s %5.2f %5.2f %6.2f\n", '2D', $tu, $ts, $tt; But your real gains will come when you want to do something which does not require iterating through all the elements you have created. -- Paul Johnson - [EMAIL PROTECTED] http://www.pjcj.net -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>