I'm too much of a Java-ignorant to be able to pinpoint the 'real' differences here, but it seems to me that the Java-hashlike construct you're using is quite a different beast than Perl's hashes.
Whereas in Perl you have real arrays of real hashes, and the hashes deep down there _do have_ _stored_ keys _and_ stored values, I somewhat miss the hash keys in the Java code - but I might be wrong.
Obviously, if the basic underlying data structures used in Perl are indeed much more sophisticated/complicated than what's there for it in Java - despite their 'almost alikeness' - the processing time will reflect this difference between the structures used.
Update By rewriting the core of your Perl code as
if ( $gene_to < $gene_from ) {
# split
# low range first
$temp_gene_to_legal_range = [
# { FROM => 0, TO => $ge
+ne_to },
# {
# FROM => $gene_
+from,
# TO => $zone_
+o->{_chromosome_length}
# }
0, $gene_to, $gene_from, $zo
+ne_o->{_chromosome_length}
];
}
else {
# single
$temp_gene_to_legal_range =
# [ { FROM => $gene_from, TO
+=> $gene_to } ];
[ $gene_from, $gene_to ]
}
the time displayed goes down on my machine from approx. 14.5 to 11.4. Might be that that's another path to follow.