如有疑问,基准
use strict;
use warnings;
use v5.14;
use Benchmark qw(cmpthese);
my @l = qw(A T G C X);
my $BAR;
$BAR .= $l[rand(@l)] for 1..10000;
cmpthese(-1, {
substr => sub { my $str = $BAR;
while ($str=~/X/ig) {
my $pos = pos($str);
substr($str, $pos-1,1) = "A";
} return $str; },
substitution => sub { my $str = $BAR; $str =~ s/X/A/ig; return $str; },
transliteration => sub { my $str = $BAR; $str =~ tr/xX/aA/; return $str; }});
结果:
Rate substr substitution transliteration
substr 55.1/s -- -98% -100%
substitution 2496/s 4433% -- -93%
transliteration 35134/s 63719% 1308% --
正如我们从结果中看到的那样,对于这个特定的字符串和正则表达式,substr 方法确实非常慢,每秒 55 次。使用替换的速度大约快 45 倍,但这与快 600 倍的音译相比相形见绌。
因此,在这种情况下,音译似乎是最快的。这是有道理的,因为它是迄今为止最简单的潜艇。