9 use POE::XS::Queue::Array;
11 # The sequence length should be at least as many items as there are
14 sub MAX_PRIORITIES () { 200 }
15 sub SEQUENCE_LENGTH () { 5000 }
17 die if SEQUENCE_LENGTH < MAX_PRIORITIES;
19 # Fisher-Yates shuffle them, for extra yummy randomness. Use srand
20 # with the same seed each time so every @seq list represents different
21 # lengths of the same "random" sequence.
25 my $priorities = shift;
26 my $factor = SEQUENCE_LENGTH / $priorities;
28 @seq = map { [ int($_ / $factor), $_ ] } (0..(SEQUENCE_LENGTH-1));
33 my $j = int rand($i+1);
34 @seq[$i,$j] = @seq[$j,$i];
39 # Run through the list for a number of benchmarks. Each benchmark has
40 # a different number of priorities.
42 for my $priorities (1..MAX_PRIORITIES) {
44 build_list($priorities);
46 # One for each queue implementation.
47 for my $impl (qw(POE::Queue::Array POE::XS::Queue::Array)) {
49 my $queue = $impl->new();
51 ### Plain enqueue/dequeue.
53 my ($begin_usr, $begin_sys) = (times)[0,1];
54 $queue->enqueue(@$_) for @seq;
55 my ($cease_usr, $cease_sys) = (times)[0,1];
57 my $elapsed = ($cease_usr - $begin_usr) + ($cease_sys - $begin_sys);
61 $impl, "enqueue-plain",
62 $elapsed/SEQUENCE_LENGTH, # Time per operation.
67 ($begin_usr, $begin_sys) = (times)[0,1];
68 1 while $queue->dequeue_next;
69 ($cease_usr, $cease_sys) = (times)[0,1];
71 $elapsed = ($cease_usr - $begin_usr) + ($cease_sys - $begin_sys);
75 $impl, "dequeue-plain",
76 $elapsed/SEQUENCE_LENGTH, # Time per operation.
81 ### Next-priority enqueue/dequeue. The enqueue is actually just a
82 ### plain one, but we get to see the effect of internal data
83 ### structure freeing tradeoffs.
85 # ($begin_usr, $begin_sys) = (times)[0,1];
86 # $queue->enqueue(@$_) for @seq;
87 # ($cease_usr, $cease_sys) = (times)[0,1];
89 # $elapsed = ($cease_usr - $begin_usr) + ($cease_sys - $begin_sys);
93 # $impl, "enqueue-np",
94 # $elapsed/SEQUENCE_LENGTH, # Time per operation.
99 # ($begin_usr, $begin_sys) = (times)[0,1];
100 # 1 while scalar(@{$queue->dequeue_next_priority});
101 # ($cease_usr, $cease_sys) = (times)[0,1];
103 # $elapsed = ($cease_usr - $begin_usr) + ($cease_sys - $begin_sys);
107 # $impl, "dequeue-np",
108 # $elapsed/SEQUENCE_LENGTH, # Time per operation.