6 use Benchmark qw<cmpthese>;
8 use lib qw<blib/arch blib/lib>;
9 use Scalar::Vec::Util qw<vfill vcopy veq>;
13 if (eval "use Bit::Vector; 1") {
14 *HAS_BV = sub () { 1 };
16 *HAS_BV = sub () { 0 };
19 print "have Bit::Vector.\n\n";
27 $_[0] = 0 if $_[0] >= $n;
33 $_[0] = 0 if $_[0] >= $n;
38 return $n - ($_[0] > $_[1] ? $_[0] : $_[1])
42 my ($tests, $desc) = @_;
44 my ($x, $y, $bv) = map "", 1 .. 2;
45 vec($_, $n - 1, 1) = 0 for $x, $y;
46 $bv = Bit::Vector->new($n, 1) if HAS_BV;
48 my ($i, $j, $k) = map 0, 1 .. 3;
52 print ", $desc" if defined $desc;
57 my ($u, $v) = @{$tests->[$i]};
63 my ($u, $v) = @{$tests->[$j]};
64 Scalar::Vec::Util::vfill_pp($y, $u, $v, 1);
69 my ($u, $v) = @{$tests->[$k]};
70 $bv->Interval_Fill($u, $u + $v - 1);
79 bench_fill [ map { my $i = $_; map [ $i, $n - $i - $_ ], 0 .. 8 } 0 .. 8 ];
82 my ($tests, $desc) = @_;
84 my ($x1, $x2, $y1, $y2, $bv1, $bv2) = map "", 1 .. 4;
85 vec($_, $n - 1, 1) = 0 for $x1, $x2, $y1, $y2;
86 ($bv1, $bv2) = Bit::Vector->new($n, 2) if HAS_BV;
88 my ($i, $j, $k) = map 0, 1 .. 3;
92 print ", $desc" if defined $desc;
97 my ($u, $v, $w) = @{$tests->[$i]};
98 vcopy($x1, $u, $x2, $v, $w);
103 my ($u, $v, $w) = @{$tests->[$j]};
104 Scalar::Vec::Util::vcopy_pp($y1, $u, $y2, $v, $w);
109 my ($u, $v, $w) = @{$tests->[$k]};
110 $bv2->Interval_Copy($bv1, $v, $u, $w);
124 map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
127 ], 'aligned, forward';
134 map [ $j, $i, len($i, $j) - $_ ], 0 .. 8;
137 ], 'aligned, backward';
144 map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
150 my ($tests, $desc) = @_;
152 my ($x, $y, $bv) = map "", 1 .. 2;
153 vec($_, $n - 1, 1) = 0 for $x, $y;
154 $bv = Bit::Vector->new($n, 1) if HAS_BV;
156 my ($i, $j, $k) = map 0, 1 .. 3;
160 print ", $desc" if defined $desc;
165 my ($u, $v, $w) = @{$tests->[$i]};
166 vcopy($x, $u, $x, $v, $w);
171 my ($u, $v, $w) = @{$tests->[$j]};
172 Scalar::Vec::Util::vcopy_pp($y, $u, $y, $v, $w);
177 my ($u, $v, $w) = @{$tests->[$k]};
178 $bv->Interval_Copy($bv, $v, $u, $w);
192 map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
195 ], 'aligned, forward';
202 map [ $j, $i, len($i, $j) - $_ ], 0 .. 8;
205 ], 'aligned, backward';
212 map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
223 my ($bv1, $bv2, $bv3, $bv4);
225 ($bv1, $bv2, $bv3, $bv4) = Bit::Vector->new($n, 4);
230 print "eq, origin:\n";
232 veq => sub { veq $x, 0, $y, 0, $n },
233 veq_pp => sub { Scalar::Vec::Util::veq_pp($x, 0, $y, 0, $n) },
234 (veq_bv => sub { $bv1->equal($bv2) }) x HAS_BV,
238 print "eq, random:\n";
240 veq => sub { veq $x, inc($i), $y, inc($j), len($i, $j) },
241 veq_pp => sub { Scalar::Vec::Util::veq_pp($x, inc($i), $y, inc($j), len($i, $j)) },
247 $bv3->Interval_Copy($bv1, 0, $i, $l);
249 $bv4->Interval_Copy($bv2, 0, $j, $l);