#!/usr/bin/perl use strict; use warnings; use Benchmark qw/cmpthese timethese/; my $y = join "", 1..10000; my %tr; @tr{map chr, 0..255} = map chr, 1..255,0; my $tr = eval 'sub {$_[0] =~ tr/\x00-\xff/\x01-\xff\x00/r}'; my $trans = sub { my $x = $y; $x =~ tr/\x00-\xff/\x01-\xff\x00/r; }; my $subst = sub { my $x = $y; $x =~ s/(.)/$tr{$1}/egr; }; my $eval = sub { my $x = $y; eval '$x =~ tr/\x00-\xff/\x01-\xff\x00/r'; }; my $preceval = sub { my $x = $y; &$tr($x); }; my $z = &$trans; $z eq &$subst or die; $z eq &$eval or die; $z eq &$preceval or die; length($y) == length($z) or die; printf "length: %s\n", length($y); timethese(0, { trans => $trans, subst => $subst, eval => $eval, preceval => $preceval, });