#!/usr/bin/perl
use warnings;
use strict;
use Test::More tests => 5;
use Benchmark qw(cmpthese);
my $bits = join q(), map chr rand 256, 1 .. 1e7;
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 $chars = join q(), map sprintf('\x%02x', $_), 0 .. 255;
my $rev = join q(), map sprintf('\x%02x', $_), reverse 0 .. 255;
eval "sub translate { \$_[0] =~ tr/$chars/$rev/ } ; 1 " or die $@;
}
my $copy = $bits;
classic($copy) for 1 .. 2;
is($bits, $copy, 'double negation');
single($copy);
classic($bits);
is($bits, $copy, 'single - classic');
classic($bits);
long($copy);
is($bits, $copy, 'classic - long');
classic($bits);
translate($copy);
is($bits, $copy, 'classic - translate');
classic($bits);
str($copy);
is($bits, $copy, 'classic - str');
cmpthese(-10,
{ classic => sub { classic($bits) },
single => sub { single($bits) },
long => sub { long($bits) },
translate => sub { translate($bits) },
str => sub { str($bits) },
}
);