]> git.vpit.fr Git - perl/modules/Scalar-Vec-Util.git/blob - samples/bench.pl
Be proud about being O(1) memory
[perl/modules/Scalar-Vec-Util.git] / samples / bench.pl
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5
6 use Benchmark qw/cmpthese/;
7
8 use lib qw{blib/arch blib/lib};
9 use Scalar::Vec::Util qw/vfill vcopy veq/;
10 my $has_bv = eval "use Bit::Vector; 1" || 0;
11 print 'We ' . ('don\'t ' x !$has_bv) . "have Bit::Vector.\n";
12
13 my $n = 100_000;
14 my $i = 0;
15 my $x = '';
16
17 sub inc {
18  ++$_[0];
19  $_[0] = 0 if $_[0] >= $n;
20  return $_[0];
21 }
22
23 sub len {
24  return $n - ($_[0] > $_[1] ? $_[0] : $_[1])
25 }
26
27 my ($bv1, $bv2, $bv3, $bv4);
28 if ($has_bv) {
29  ($bv1, $bv2, $bv3, $bv4) = Bit::Vector->new($n, 4);
30 }
31
32 print "fill:\n";
33 cmpthese -3, {
34  vfill     => sub { vfill $x, inc($i), $n - $i, 1 },
35  vfill_pp  => sub { Scalar::Vec::Util::vfill_pp($x, inc($i), $n - $i, 1) },
36  (vfill_bv => sub { $bv1->Interval_Fill(inc($i), $n - 1) }) x $has_bv
37 };
38
39 $i = 0;
40 my $j = int $n / 2;
41 my $y = '';
42 print "\ncopy:\n";
43 cmpthese -3, {
44  vcopy     => sub { vcopy $x, inc($i), $y, inc($j), len($i, $j) },
45  vcopy_pp  => sub { Scalar::Vec::Util::vcopy_pp($x, inc($i), $y, inc($j), len($i, $j)) },
46  (vcopy_bv => sub { $bv2->Interval_Copy($bv1, inc($j), inc($i), len($i, $j)) }) x $has_bv
47 };
48
49 $i = 0;
50 $j = int $n / 2;
51 print "\nmove:\n";
52 cmpthese -3, {
53  vmove     => sub { vcopy $x, inc($i), $x, inc($j), len($i, $j) },
54  vmove_pp  => sub { Scalar::Vec::Util::vcopy_pp($x, inc($i), $x, inc($j), len($i, $j)) },
55  (vmove_bv => sub { $bv1->Interval_Copy($bv1, inc($j), inc($i), len($i, $j)) }) x $has_bv
56 };
57
58 $i = 0;
59 $j = int $n / 2;
60 vfill $x, 0, $n, 1;
61 vfill $y, 0, $n, 1;
62 if ($has_bv) {
63  $bv1->Fill();
64  $bv2->Fill();
65 }
66 print "\neq:\n";
67 cmpthese -3, {
68  veq     => sub { veq $x, inc($i), $y, inc($j), len($i, $j) },
69  veq_pp  => sub { Scalar::Vec::Util::veq_pp($x, inc($i), $y, inc($j), len($i, $j)) },
70  (veq_bv => sub {
71    inc($i);
72    inc($j);
73    my $l = len($i, $j);
74    $bv3->Resize($l);
75    $bv3->Interval_Copy($bv1, 0, $i, $l);
76    $bv4->Resize($l);
77    $bv4->Interval_Copy($bv2, 0, $j, $l);
78    $bv3->equal($bv4);
79   }) x $has_bv
80 };