Najszybszy sposób na znalezienie pozycji niezgodności między dwoma łańcuchami o tej samej długości

Mam miliony par ciągów o tej samej długości, które chcę porównać i znaleźć pozycję, w której ma niedopasowania.

Na przykład dla każdego$str1 i$str2 chcemy znaleźć pozycję niezgodności z$str_source:

$str_source = "ATTCCGGG";

$str1       = "ATTGCGGG"; # 1 mismatch with Str1 at position 3 (0-based)
$str2       = "ATACCGGC"; # 2 mismatches with source at position  2 and 7

Czy jest na to szybki sposób. Obecnie mam metodę w stylu C, która zapętla każdą pozycję w obu łańcuchach, używając funkcji substr. Ale to podejście jest strasznie powolne.

my @mism_pos;
for $i (0 .. length($str_source)) {
   $source_base = substr($str_source,$i,1);
   $str_base    = substr($str2,$i,$1);

  if ($source_base ne $str_base) {
     push @mism_pos,$i;
  }

}

questionAnswers(9)

yourAnswerToTheQuestion