Algorithm-SpatialIndex

 view release on metacpan or  search on metacpan

examples/profile.pl  view on Meta::CPAN

use strict;
use warnings;
use lib 'lib';
use Algorithm::SpatialIndex;

my $what = lc(shift(@ARGV)||'poll');
my $bucks = 50;
my $scale = 2;
my @limits = qw(-10 -10 10 10);

my $use_dbi = 1;
if ($use_dbi) {
  eval "use DBI; use DBD::SQLite;";
  unlink 't.sqlite';
  $use_dbi = DBI->connect("dbi:SQLite:dbname=t.sqlite", "", "");
}

my @si_opt = (
  strategy => 'QuadTree',
  storage  => $use_dbi ? 'DBI' : 'Memory',
  limit_x_low => $limits[0],
  limit_y_low => $limits[1],
  limit_x_up  => $limits[2],
  limit_y_up  => $limits[3],
  bucket_size => $bucks,
  dbh_rw => $use_dbi,
);

my $idx;

if ($what eq 'insert') {
  DB::enable_profile();
}
my $iter = 0;
do {
  $idx = Algorithm::SpatialIndex->new(@si_opt);
  my $i = 0;
  foreach my $x (map {$_/$scale} $limits[0]*$scale..$limits[2]*$scale) {
    foreach my $y (map {$_/$scale} $limits[1]*$scale..$limits[3]*$scale) {
      $idx->insert($i, $x, $y);
      $i++;
    }
  }
  warn $i;
  $iter++;
} while ($what eq 'insert' and $iter < 2);

if ($what eq 'insert') {
  DB::disable_profile();
}
else {
  DB::enable_profile();
}
if ($what eq 'poll') {
  my @rect_small = (-1.5, -1.4, -1.51, -1.41);
  foreach my $i (1..40000) {
    warn $i if $i%1000 == 0;
    my @o = $idx->get_items_in_rect(@rect_small);
  }
}



( run in 0.557 second using v1.01-cache-2.11-cpan-62a16548d74 )