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% --