Doubly
view release on metacpan or search on metacpan
lib/Doubly.pm view on Meta::CPAN
$outer->bulk_add($inner, $inner2);
# Navigate outer list
$outer->start;
is($outer->data->data, 'a'); # inner list, first item
is($outer->data->next->data, 'b'); # navigates inner, returns 'b'
# Navigate to inner2, then to its last item (which is $inner)
is($outer->next->data->data, 1); # inner2's first item
is($outer->next->data->end->data->start->data, 'a'); # deeply nested!
=head1 BENCHMARKS
my $r = timethese(10000, {
'Doubly::Linked' => sub {
my $linked = Doubly::Linked->new(123);
$linked->bulk_add(0..1000);
$linked = $linked->end;
$linked->is_end;
$linked = $linked->start;
$linked->is_start;
$linked->add(789);
$linked->destroy;
},
'Doubly::Linked::PP' => sub {
my $linked = Doubly::Linked::PP->new(123);
$linked->bulk_add(0..1000);
$linked = $linked->end;
$linked->is_end;
$linked = $linked->start;
$linked->is_start;
$linked->add(789);
},
'Doubly' => sub {
my $linked = Doubly->new(123);
$linked->bulk_add(0..1000);
$linked = $linked->end;
$linked->is_end;
$linked = $linked->start;
$linked->is_start;
$linked->add(789);
$linked->destroy;
},
'Doubly::Pointer' => sub {
my $linked = Doubly::Pointer->new(123);
$linked->bulk_add(0..1000);
$linked = $linked->end;
$linked->is_end;
$linked = $linked->start;
$linked->is_start;
$linked->add(789);
$linked->destroy;
},
});
cmpthese $r;
Docker perl:5.38-threaded - Threaded environment (where only Doubly is truly safe):
Benchmark: timing 10000 iterations of Doubly, Doubly::Linked, Doubly::Linked::PP, Doubly::Pointer...
Doubly: 0.704658 wallclock secs ( 0.70 usr + 0.00 sys = 0.70 CPU) @ 14285.71/s (n=10000)
Doubly::Linked: 4.71918 wallclock secs ( 3.10 usr + 1.61 sys = 4.71 CPU) @ 2123.14/s (n=10000)
Doubly::Linked::PP: 12.1816 wallclock secs (10.76 usr + 1.39 sys = 12.15 CPU) @ 823.05/s (n=10000)
Doubly::Pointer: 0.778561 wallclock secs ( 0.77 usr + 0.00 sys = 0.77 CPU) @ 12987.01/s (n=10000)
Rate Doubly::Linked::PP Doubly::Linked Doubly::Pointer Doubly
Doubly::Linked::PP 823/s -- -61% -94% -94%
Doubly::Linked 2123/s 158% -- -84% -85%
Doubly::Pointer 12987/s 1478% 512% -- -9%
Doubly 14286/s 1636% 573% 10% --
Docker perl:5.38 - None threaded environment:
Benchmark: timing 10000 iterations of Doubly, Doubly::Linked, Doubly::Linked::PP, Doubly::Pointer...
Doubly: 0.712633 wallclock secs ( 0.70 usr + 0.01 sys = 0.71 CPU) @ 14084.51/s (n=10000)
Doubly::Linked: 16.0794 wallclock secs ( 4.05 usr + 5.75 sys = 9.80 CPU) @ 1020.41/s (n=10000)
Doubly::Linked::PP: 13.0293 wallclock secs (11.73 usr + 1.27 sys = 13.00 CPU) @ 769.23/s (n=10000)
Doubly::Pointer: 0.775681 wallclock secs ( 0.77 usr + 0.00 sys = 0.77 CPU) @ 12987.01/s (n=10000)
Rate Doubly::Linked::PP Doubly::Linked Doubly::Pointer Doubly
Doubly::Linked::PP 769/s -- -25% -94% -95%
Doubly::Linked 1020/s 33% -- -92% -93%
Doubly::Pointer 12987/s 1588% 1173% -- -8%
Doubly 14085/s 1731% 1280% 8% --
=head1 AUTHOR
LNATION, C<< <email at lnation.org> >>
=head1 LICENSE AND COPYRIGHT
This software is Copyright (c) 2024 by LNATION.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)
=cut
( run in 0.516 second using v1.01-cache-2.11-cpan-71847e10f99 )