1#!perl -w
2use strict;
3use blib;
4use POE::XS::Queue::Array ();
5use POE::Queue::Array ();
6use Benchmark;
7
8# 1000 items to queue
9my @items = map [ $_, $_ ], map rand(1000), 1..1000;
10
11# test queues for timing adjust_priority
12my %adjust;
13my %adjust_ids;
14my @adjust_val;
15for my $impl (qw(POE::XS::Queue::Array POE::Queue::Array)) {
16  my $queue = $impl->new;
17
18  my @ids = map $queue->enqueue(@$_), @items;
19
20  $adjust{$impl} = $queue;
21  $adjust_ids{$impl} = \@ids;
22}
23for my $index (0..999) {
24  $adjust_val[$index] = rand(100) - 50;
25}
26
27timethese(-10,
28	  {
29	   xs_big => sub { big('POE::XS::Queue::Array') },
30	   perl_big => sub { big('POE::Queue::Array') },
31	   xs_enqueue => sub { enqueue('POE::XS::Queue::Array') },
32	   perl_enqueue => sub { enqueue('POE::Queue::Array') },
33	   xs_adjust => sub { adjust('POE::XS::Queue::Array') },
34	   perl_adjust => sub { adjust('POE::Queue::Array') },
35	  });
36
37# does general queue work
38sub big {
39  my $class = shift;
40
41  my $queue = $class->new;
42
43  my @ids = map $queue->enqueue(@$_), @items;
44
45  for my $id (@ids[1..100]) {
46    $queue->adjust_priority($id, sub { 1 }, -5);
47  }
48  my %remove = map { $_ => 1 } @ids[-100..-1];
49  $queue->remove_items(sub { $remove{$_[0]} });
50
51  for my $id (@ids[-200..-101]) {
52    $queue->remove_item($id, sub { 1 });
53  }
54
55  $queue->remove_items(sub { 0 });
56
57  $queue->dequeue_next while $queue->get_item_count;
58}
59
60# enqueue a bunch
61sub enqueue {
62  my $class = shift;
63
64  my $queue = $class->new;
65
66  my @ids = map $queue->enqueue(@$_), @items;
67}
68
69# adjust the priorities on a bunch of items
70sub adjust {
71  my $class = shift;
72
73  my $queue = $adjust{$class};
74
75  my $index = 0;
76  for my $id (@{$adjust_ids{$class}}) {
77    $queue->adjust_priority($id, sub { 1 }, $adjust_val[$index]);
78    ++$index;
79  }
80}
81