#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(shuffle sum max);
use Time::HiRes qw(gettimeofday tv_interval);
use FindBin; use lib "$FindBin::Bin/../lib";
use Data::BitStream::WordVec;
use Data::BitStream::String;
use Data::BitStream::BLVec;
#use Data::BitStream::XS;
#use Data::BitStream::Vec;
#use Data::BitStream::BitVec;
sub ceillog2 {
my $v = shift;
$v--;
my $b = 1;
$b++ while ($v >>= 1);
$b;
}
my $list_n = 40000;
my @list;
push @list, int(rand(1000)) for (1 .. $list_n);
my %s1 = (
'string ', Data::BitStream::String->new,
'wordvec', Data::BitStream::WordVec->new,
'blvec', Data::BitStream::BLVec->new,
#'vec ', Data::BitStream::Vec->new,
#'bitvec ', Data::BitStream::BitVec->new,
#'xs', Data::BitStream::XS->new,
);
my %s2 = (
'string ', Data::BitStream::String->new,
'wordvec', Data::BitStream::WordVec->new,
'blvec', Data::BitStream::BLVec->new,
#'vec ', Data::BitStream::Vec->new,
#'bitvec ', Data::BitStream::BitVec->new,
#'xs', Data::BitStream::XS->new,
);
foreach my $s1name (keys %s1) {
my $s1 = $s1{$s1name};
$s1->erase_for_write;
$s1->put_gamma($_) for @list;
}
my $put_master = Data::BitStream::String->new;
$put_master->write(5, 17);
$put_master->put_gamma($_) for @list;
$put_master->write_close;
foreach my $s1name (keys %s1) {
foreach my $s2name (keys %s2) {
time_copy($s1name, $s2name, @list);
time_put ($s1name, $s2name, @list);
}
}
sub time_put {
my $s1name = shift;
my $s2name = shift;
my $s1 = $s1{$s1name};
my $s2 = $s2{$s2name};
my $t1 = [gettimeofday];
#$s2->put_string($s1->to_string);
$s2->write(5,17);
$s2->put_stream($s1);
my $e1 = int(tv_interval($t1)*1_000_000);
printf(" put %-7s to %-7s %7.3fms\n", $s1name, $s2name, $e1/1000);
die "put didn't work" unless $s2->to_string eq $put_master->to_string;
$s2->erase_for_write;
1;
}
sub time_copy {
my $s1name = shift;
my $s2name = shift;
my $s1 = $s1{$s1name};
my $s2 = $s2{$s2name};
my $t1 = [gettimeofday];
$s2->from_string($s1->to_string);
my $e1 = int(tv_interval($t1)*1_000_000);
printf("copy %-7s to %-7s %7.3fms\n", $s1name, $s2name, $e1/1000);
die "copy didn't work" unless $s1->to_string eq $s2->to_string;
$s2->erase_for_write;
1;
}