use Benchmark;
use Apache::Session::Serialize::UUEncode;
use Apache::Session::Serialize::Base64;
use Apache::Session::Serialize::Storable;

use vars qw($hash);

$hash = { 
    serialized => undef, 
    data => {
        foo => 'A'x32,
        bar => [1,2,3,4,5,6,7,8,9,0],
        baz => {
            blah => 'A'x32,
            bleh => 'B'x32
        }
    }
};

sub uue {
    my $z = Apache::Session::Serialize::UUEncode::serialize($hash);
    Apache::Session::Serialize::UUEncode::unserialize($hash);
}

sub base64 {
    my $z = Apache::Session::Serialize::Base64::serialize($hash);
    Apache::Session::Serialize::Base64::unserialize($hash);
}

sub storable {
    my $z = Apache::Session::Serialize::Storable::serialize($hash);
    Apache::Session::Serialize::Storable::unserialize($hash);
}

timethese(-3, {
    Base64   => \&base64,
    UUE      => \&uue,
    Storable => \&storable
});

$hash->{data}->{foo} = 'A'x32000;

timethese(-3, {
    'Big Base64'   => \&base64,
    'Big UUE'      => \&uue,
    'Big Storable' => \&storable,
});

print "Length with UUE: ". length(Apache::Session::Serialize::UUEncode::serialize($hash)) ."\n";
print "Length with Base64: ". length(Apache::Session::Serialize::Base64::serialize($hash)) ."\n";
print "Length with Storable: ". length(Apache::Session::Serialize::Storable::serialize($hash)) ."\n";