### Typical sequence lengths are 10-50k letters my $sub = "CGAGCGTTGACGCNNAGCTAGT"; ### Count base frequencies while ($sub =~ /([GCATN])/g) { if ($1 eq 'G') { $bases{g}++; } if ($1 eq 'C') { $bases{c}++; } if ($1 eq 'A') { $bases{a}++; } if ($1 eq 'T') { $bases{t}++; } if ($1 eq 'N') { $bases{n}++; } } ### I need to create an array of bases to pass to rand() my @bases = ( ('G') x $bases{g}, ('C') x $bases{c}, ('A') x $bases{a}, ('T') x $bases{t}, ('N') x $bases{n}, ); #### my $sub = "CGAGCGTTGACGCNNAGCTAGT"; my @bases = split //, $sub; #### my $sub = 'CGAGCGTTGACGCNNAGCTAGT'; my @bases = split //, $sub; my $count = 100; my $len = length $sub; @promoters_regex = ( qr'[NT][GCATN][NG][NC][NG][NT][NG]', qr'[NG][NT][NG][NC][NG][GCATN][NT]', qr'[NA][GCATN][NC][NG][NC][NA][NC]', qr'[NC][NA][NC][NG][NC][GCATN][NA]', ); my $permutations_total = 0; while ($count--) { my $ilen = $len; my $string; $string .= $bases[rand @bases] while $ilen--; foreach my $regex (@promoters_regex) { $permutations_totals += scalar($string =~ m/$regex/g); } } #### With count == 100: Benchmark: running mine, yours, each for at least 10 CPU seconds... mine: 11 wallclock secs (10.88 usr + 0.00 sys = 10.88 CPU) @ 172.52/s (n=1877) yours: 19 wallclock secs (18.49 usr + 0.01 sys = 18.50 CPU) @ 38.76/s (n=717) Rate yours mine yours 38.8/s -- -78% mine 173/s 345% -- With count == 1000: Benchmark: running mine, yours, each for at least 30 CPU seconds... mine: 33 wallclock secs (31.83 usr + 0.00 sys = 31.83 CPU) @ 17.78/s (n=566) yours: 33 wallclock secs (32.43 usr + 0.00 sys = 32.43 CPU) @ 7.68/s (n=249) Rate yours mine yours 7.68/s -- -57% mine 17.8/s 132% -- #### With count == 100: Benchmark: running mine, yours, each for at least 10 CPU seconds... mine: 11 wallclock secs (10.43 usr + 0.00 sys = 10.43 CPU) @ 174.98/s (n=1825) yours: 11 wallclock secs (10.26 usr + 0.00 sys = 10.26 CPU) @ 74.37/s (n=763) Rate yours mine yours 74.4/s -- -57% mine 175/s 135% -- With count == 1000: Benchmark: running mine, yours, each for at least 30 CPU seconds... mine: 33 wallclock secs (31.58 usr + 0.00 sys = 31.58 CPU) @ 17.42/s (n=550) yours: 32 wallclock secs (31.24 usr + 0.00 sys = 31.24 CPU) @ 7.55/s (n=236) Rate yours mine yours 7.55/s -- -57% mine 17.4/s 131% --