my %rot;
@rot{'A'..'M'} = ('N'..'Z');
@rot{'N'..'Z'} = ('A'..'M');
@rot{'a'..'m'} = ('n'..'z');
@rot{'n'..'z'} = ('a'..'m');
my $chars_to_change = join('', map quotemeta, keys %rot);
sub rot13dynre {
local $_ = @_ ? $_[0] : $_;
s/([$chars_to_change])/$rot{$1}/g;
return $_;
}
####
my %rot;
@rot{'A'..'M'} = ('N'..'Z');
@rot{'N'..'Z'} = ('A'..'M');
@rot{'a'..'m'} = ('n'..'z');
@rot{'n'..'z'} = ('a'..'m');
*rot13builttr = eval 'sub {
local $_ = @_ ? $_[0] : $_;
tr{' . join('', map quotemeta, keys %rot) . '}
{' . join('', map quotemeta, values %rot) . '};
return $_;
}';
##
##
Benchmark: running rot13builtre, rot13builttr, rot13dynre, rot13dynre2, rot13splitmap, rot13substrfor, rot13tr, each for at least 3 CPU seconds...
rot13builtre: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 572.75/s (n= 1795)
rot13builttr: 4 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 61539.53/s (n=195388)
rot13dynre: 3 wallclock secs ( 3.07 usr + 0.00 sys = 3.07 CPU) @ 567.80/s (n= 1746)
rot13dynre2: 3 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 562.70/s (n= 1741)
rot13splitmap: 3 wallclock secs ( 3.29 usr + 0.00 sys = 3.29 CPU) @ 364.99/s (n= 1199)
rot13substrfor: 3 wallclock secs ( 3.22 usr + 0.00 sys = 3.22 CPU) @ 491.16/s (n= 1584)
rot13tr: 4 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 61032.31/s (n=188895)
Rate rot13splitmap rot13substrfor rot13dynre2 rot13dynre rot13builtre rot13tr rot13builttr
rot13splitmap 365/s -- -26% -35% -36% -36% -99% -99%
rot13substrfor 491/s 35% -- -13% -13% -14% -99% -99%
rot13dynre2 563/s 54% 15% -- -1% -2% -99% -99%
rot13dynre 568/s 56% 16% 1% -- -1% -99% -99%
rot13builtre 573/s 57% 17% 2% 1% -- -99% -99%
rot13tr 61032/s 16622% 12326% 10746% 10649% 10556% -- -1%
rot13builttr 61540/s 16760% 12429% 10836% 10738% 10645% 1% --
##
##
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw( cmpthese );
my %rot;
@rot{'A'..'M'} = ('N'..'Z');
@rot{'N'..'Z'} = ('A'..'M');
@rot{'a'..'m'} = ('n'..'z');
@rot{'n'..'z'} = ('a'..'m');
my $chars_to_change = join('', map quotemeta, keys %rot);
sub rot13splitmap {
return join '',
map { exists $rot{$_} ? $rot{$_} : $_ }
split '',
@_ ? $_[0] : $_;
}
sub rot13substrfor {
my $s = @_ ? $_[0] : $_;
foreach my $i (0..length($s)-1) {
my $c = substr($s, $i, 1);
substr($s, $i, 1, $rot{$c})
if exists $rot{$c};
}
return $s;
}
sub rot13tr {
local $_ = @_ ? $_[0] : $_;
tr/a-zA-Z/n-za-mN-ZA-M/;
return $_;
}
*rot13builttr = eval 'sub {
local $_ = @_ ? $_[0] : $_;
tr{' . join('', map quotemeta, keys %rot) . '}
{' . join('', map quotemeta, values %rot) . '};
return $_;
}';
*rot13builtre = eval 'sub {
local $_ = @_ ? $_[0] : $_;
s{([' . join('', map quotemeta, keys %rot) . '])}
{$rot{$1}}g;
return $_;
}';
sub rot13dynre {
local $_ = @_ ? $_[0] : $_;
s/([$chars_to_change])/$rot{$1}/g;
return $_;
}
{
my $re = qr/[$chars_to_change]/;
sub rot13dynre2 {
local $_ = @_ ? $_[0] : $_;
s/($re)/$rot{$1}/g;
return $_;
}
}
our $data;
{
local $/;
$data = ;
}
cmpthese(-3, {
rot13splitmap => 'my $rv = rot13splitmap ($data); 1',
rot13substrfor => 'my $rv = rot13substrfor($data); 1',
rot13tr => 'my $rv = rot13tr ($data); 1',
rot13builttr => 'my $rv = rot13builttr ($data); 1',
rot13builtre => 'my $rv = rot13builtre ($data); 1',
rot13dynre => 'my $rv = rot13dynre ($data); 1',
rot13dynre2 => 'my $rv = rot13dynre2 ($data); 1',
});
__DATA__
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus
luctus nulla sed tellus. Sed vitae sapien in elit vestibulum faucibus.
Maecenas sollicitudin, magna quis vestibulum convallis, ligula nulla
fringilla augue, nec rutrum dolor quam vel justo. Vivamus nisi odio,
ullamcorper sed, venenatis id, imperdiet eleifend, neque. Vivamus
justo felis, euismod in, convallis auctor, egestas id, purus. In
rutrum nisi in lectus. Aliquam elementum placerat dui. Integer ut pede
sit amet magna pulvinar placerat. Maecenas massa lorem, lobortis ut,
adipiscing at, suscipit nec, lectus. Curabitur mattis adipiscing sem.
Mauris pharetra vehicula eros. Sed pellentesque elit laoreet augue.
Cras non tellus. Quisque volutpat lectus in sem. Fusce vulputate justo
ut pede. Aliquam ante pede, tempor in, dictum in, blandit eu, sapien.
Morbi vestibulum, metus eu auctor vulputate, nulla lectus condimentum
nisi, ac pulvinar ligula nunc in felis. Curabitur id orci ac est
luctus molestie.