From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!perl -w
use strict;
use blib;
use POE::XS::Queue::Array ();
use POE::Queue::Array ();
use Benchmark;
# 1000 items to queue
my @items = map [ $_, $_ ], map rand(1000), 1..1000;
# test queues for timing adjust_priority
my %adjust;
my %adjust_ids;
my @adjust_val;
for my $impl (qw(POE::XS::Queue::Array POE::Queue::Array)) {
my $queue = $impl->new;
my @ids = map $queue->enqueue(@$_), @items;
$adjust{$impl} = $queue;
$adjust_ids{$impl} = \@ids;
}
for my $index (0..999) {
$adjust_val[$index] = rand(100) - 50;
}
timethese(-10,
{
xs_big => sub { big('POE::XS::Queue::Array') },
perl_big => sub { big('POE::Queue::Array') },
xs_enqueue => sub { enqueue('POE::XS::Queue::Array') },
perl_enqueue => sub { enqueue('POE::Queue::Array') },
xs_adjust => sub { adjust('POE::XS::Queue::Array') },
perl_adjust => sub { adjust('POE::Queue::Array') },
});
# does general queue work
sub big {
my $class = shift;
my $queue = $class->new;
my @ids = map $queue->enqueue(@$_), @items;
for my $id (@ids[1..100]) {
$queue->adjust_priority($id, sub { 1 }, -5);
}
my %remove = map { $_ => 1 } @ids[-100..-1];
$queue->remove_items(sub { $remove{$_[0]} });
for my $id (@ids[-200..-101]) {
$queue->remove_item($id, sub { 1 });
}
$queue->remove_items(sub { 0 });
$queue->dequeue_next while $queue->get_item_count;
}
# enqueue a bunch
sub enqueue {
my $class = shift;
my $queue = $class->new;
my @ids = map $queue->enqueue(@$_), @items;
}
# adjust the priorities on a bunch of items
sub adjust {
my $class = shift;
my $queue = $adjust{$class};
my $index = 0;
for my $id (@{$adjust_ids{$class}}) {
$queue->adjust_priority($id, sub { 1 }, $adjust_val[$index]);
++$index;
}
}