use List::Util qw[ reduce ]; sub xform{ my $word = shift; $word =~ tr[ACGT][\x00\x01\x02\x03]; reduce{ ($a << 2) + $b } 0, unpack 'C*', $word; } #### package OO::Index; sub new { my $self; open RAM, '>', \$self; seek RAM, 2**28, 0; print RAM chr(0); close RAM; return bless \$self, $_[0]; } sub get { my( $self, $idx ) = @_; return unpack 'V', substr $$self, $idx*4, 4; } sub set { my( $self, $idx, $value ) = @_; substr $$self, $idx*4, 4, pack 'V', $value; return $value; } 1; #### #! perl -sw use strict; package OO::Index; sub new { my $self; open RAM, '>', \$self; seek RAM, 2**28, 0; print RAM chr(0); close RAM; return bless \$self, $_[0]; } sub get { my( $self, $idx ) = @_; return unpack 'V', substr $$self, $idx*4, 4; } sub set { my( $self, $idx, $value ) = @_; substr $$self, $idx*4, 4, pack 'V', $value; return $value; } return 1 if caller; package main; use Benchmark qw[ cmpthese ]; use List::Util qw[ reduce ]; $a = $b; sub rndStr{ join'', @_[ map{ rand @_ } 1 .. shift ] } sub xform{ my $word = shift; $word =~ tr[ACGT][\x00\x01\x02\x03]; reduce{ ($a << 2) + $b } 0, unpack 'C*', $word; } cmpthese 5, { hash => q[ my %index; $index{ rndStr 12, qw[ A C G T ] }++ for 1 .. 1e6; ], oo => q[ my $index = new OO::Index; for ( 1 .. 1e6 ) { my $i = xform rndStr 12, qw[ A C G T ]; $index->set( $i, 1+ $index->get( $i ) ); } ], }; __END__ C:\test>junk s/iter oo hash oo 35.3 -- -58% hash 15.0 136% --