#! perl -slw use strict; use Benchmark qw(cmpthese); sub single { ${ $_[0] } =~ s/(.)/~$1/ges; } sub long { ${ $_[0] } =~ s/(.{1,10000})/~$1/ges; } sub classic { ${ $_[0] } = ~${ $_[0] }; } sub str { my $blocksize = 10000; my $lb = length ${ $_[0] }; my $offset = 0; while( $offset < $lb ) { substr ${ $_[0] }, $offset, $blocksize, ~substr( ${ $_[0] }, $offset, $blocksize ); $offset += $blocksize; } } BEGIN { my $rev = join '', map sprintf( "\\x%02x", $_ ), reverse 0 .. 255; eval "sub translate { \${ \$_[0] } =~ tr[\\x00-\\xff][$rev] } ; 1 " or die $@; } our $N //= 256; $N = eval "0+$N"; #print $N; our $bits = pack 'C*', 0 .. 255; $bits x= ( $N / 256 ); cmpthese -3, { # classic => q[ classic( \$bits) ], # single => q[ single( \$bits ) ], # long => q[ long( \$bits ) ], translate => q[ translate( \$bits ) ], str => q[ str( \$bits ) ], };