I know I went a little overboard with the comments but I wanted to try to make things more clear.
I understand the feeling, but if your variable and function names are meaningful (and you use functions), you need less comments
I'll give you an example, this part of your code
I would rewrite as
for my $i ( 0 .. ( $replication_rounds - 1 ) ) {
for my $j ( 0 .. $#{ $allgen{$i} } ) {
my $date = BlahIjMeSomeDate( 200, $i, $j );
print "\>RandomHA $date \n" . $allgen{$i}[ $j ] ."\n";
}
}
See, doesn't that make more sense?
Similarly foreach my $nucleotide (@nucleotide_array) { ... I would rewrite as
foreach my $nucleotide (@nucleotide_array) {
chomp $nucleotide;
my $score = ( int rand(100000) ) / 100000;
ModifyNucleotideBasedOnScore( \$nucleotide, $score );
}
sub ModifyNucleotideBasedOnScore {
my( $nucleotide, $score ) = @_;
...
$$nucleotide =~ s/A/T/g;
What you should document is the overall algorithm
Now I'm not sure about this bioinformatics thing, but if $nucleotide is one character long, you can speed up the program by NOT using substitution operator, use assignment.
I let your program run for 10min and it grew to about 140mb in memory, at which point I killed it
Changing =~ s/... to straight assignment, shaved off a few minutes off (it reached ~140mb in memory in about 8 min)
To make sure you're squeezing the most speed out of the shuffle make sure you're using the XS version of List::Util (see About List::Util's pure Perl shuffle())
Since your program seems to be CPU/Memory bound and not IO bound, you could probably speed it up with threads, something like Re: Thread::Pool shutdown dies after abort or
my $maxNumberOfThreads = 5;
my $threadCount = 0;
for ( $i = 1 ; $i < $replication_rounds ; $i++ ) {
my $thr = threads->create(
{'context' => 'list'},
\&ReturnSomeFilteredNewGen,
);
$threadCount++;
next if $threadCount < $maxNumberOfThreads ;
JoinJoinables(\%allgen);
}
JoinJoinables(\%allgen);
sub JoinJoinables {
my( $allgen ) = @_;
while( my @joinable = threads->list(threads::joinable) ){
for my $thr( @joinable ){
my( $i, @filtered_new_gen ) = $thr->join();
$$allgen{$i} = \@filtered_new_gen;
}
}
}
|