Algorithm-Tree-NCA
view release on metacpan or search on metacpan
e/timing.pl view on Meta::CPAN
$result = $self;
} else {
# This node is either below or above the NCA:
# - we return the NCA, if we are above the NCA
# - we return a defined value, if we are below the NCA
$result = $x;
}
}
}
return $result;
}
package main;
use strict;
sub make_tree {
my($seed, $leaves) = @_;
my @nodes;
# Make $leaves nodes that will be leaves
push(@nodes, new Node) for 1..$leaves;
my @tree = @nodes;
# Repeatedly merge two neighbours
while (@tree > 1) {
my $x = $seed % (@tree - 1);
my $node = new Node($tree[$x],$tree[$x+1]);
splice(@tree, $x, 2, $node);
$seed = $x + 17;
}
return (@tree, [@nodes]);
}
sub nr { return $_[0]->{_number} }
use Algorithm::Tree::NCA;
use Benchmark;
my @seeds = (4711);
my %T = ('tarjan' => [], 'naive' => []);
my @sizes = map { 10 * $_ } (1..10);
my @counts = map {10 * $_ } (1..10);
my $Times = 20;
foreach my $seed (@seeds) {
foreach my $size (@sizes) {
foreach my $count (@counts) {
my($root, $nodesref) = make_tree($seed, $size);
{
my $before = new Benchmark;
for (1..$Times) {
my $nca = new Algorithm::Tree::NCA;
my $z;
my $i = 0;
my $cnt = $count;
$nca->preprocess($root);
while ($cnt-- > 0) {
my $x = $nodesref->[$i];
$i = ($i + 23) % (@$nodesref - 1);
my $y = $nodesref->[$i];
$z = $nca->nca($x,$y);
}
}
my $after = new Benchmark;
$T{'tarjan'}->[$size][$count]
= timediff($after,$before);
}
{
my $before = new Benchmark;
for (1..$Times) {
my $z;
my $i = 0;
my $cnt = $count;
while ($cnt-- > 0) {
my $x = $nodesref->[$i];
$i = ($i + 23) % (@$nodesref - 1);
my $y = $nodesref->[$i];
$z = $root->naive_nca($x,$y);
}
}
my $after = new Benchmark;
$T{'naive'}->[$size][$count]
= timediff($after,$before);
}
}
}
}
foreach my $s (@sizes) {
foreach my $c (@counts) {
printf "%5d%5d:\n", $s, $c;
foreach my $m (keys %T) {
printf "\t%10s: %s\n", $m, timestr($T{$m}->[$s][$c]);
}
}
}
( run in 0.368 second using v1.01-cache-2.11-cpan-e1769b4cff6 )