Doubly

 view release on metacpan or  search on metacpan

lib/Doubly.pm  view on Meta::CPAN

			$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%     --

lib/Doubly/Pointer.pm  view on Meta::CPAN

			$linked = $linked->start;
			$linked->is_start;
			$linked->add(789);
		}

	});

	cmpthese $r;


	Benchmark: timing 100000 iterations of Doubly, Doubly::Linked, Doubly::Linked::PP...
	    Doubly: 2.70105 wallclock secs ( 2.43 usr +  0.23 sys =  2.66 CPU) @ 37593.98/s (n=100000)
	Doubly::Linked: 25.6334 wallclock secs (23.54 usr +  1.88 sys = 25.42 CPU) @ 3933.91/s (n=100000)
	Doubly::Linked::PP: 190.169 wallclock secs (189.59 usr +  0.19 sys = 189.78 CPU) @ 526.93/s (n=100000)
			      Rate Doubly::Linked::PP   Doubly::Linked            Doubly
	Doubly::Linked::PP   527/s                 --             -87%              -99%
	Doubly::Linked      3934/s               647%               --              -90%
	Doubly             37594/s              7035%             856%                --


=head1 AUTHOR

t/22-memory-leaks.t  view on Meta::CPAN

    plan tests => 1;
    no_leaks_ok(sub {
        for (1..100) {
            my $list = Doubly->new();
            $list->bulk_add(1, 2, 3, 4, 5);
            $list->destroy();
        }
    }, 'bulk_add does not leak');
};

# Test 16: Verify no accumulating leaks over many iterations
subtest 'no accumulating leaks' => sub {
    plan tests => 1;
    my $baseline = leaked_count(sub {
        for (1..10) {
            my $list = Doubly->new($_);
            $list->add($_*2) for 1..5;
            $list->destroy();
        }
    });
    
    my $larger = leaked_count(sub {
        for (1..100) {
            my $list = Doubly->new($_);
            $list->add($_*2) for 1..5;
            $list->destroy();
        }
    });
    
    my $ratio = $larger / ($baseline || 1);
    ok($ratio < 2, "leak count does not scale with iterations (ratio: $ratio)")
        or diag("baseline=$baseline, larger=$larger - indicates per-iteration leak");
};

done_testing();

t/72-pointer-memory-leaks.t  view on Meta::CPAN

    plan tests => 1;
    no_leaks_ok(sub {
        for (1..100) {
            my $list = Doubly::Pointer->new();
            $list->bulk_add(1, 2, 3, 4, 5);
            $list->destroy();
        }
    }, 'bulk_add does not leak');
};

# Test 16: Verify no accumulating leaks over many iterations
subtest 'no accumulating leaks' => sub {
    plan tests => 1;
    my $baseline = leaked_count(sub {
        for (1..10) {
            my $list = Doubly::Pointer->new($_);
            $list->add($_*2) for 1..5;
            $list->destroy();
        }
    });
    
    my $larger = leaked_count(sub {
        for (1..100) {
            my $list = Doubly::Pointer->new($_);
            $list->add($_*2) for 1..5;
            $list->destroy();
        }
    });
    
    my $ratio = $larger / ($baseline || 1);
    ok($ratio < 2, "leak count does not scale with iterations (ratio: $ratio)")
        or diag("baseline=$baseline, larger=$larger - indicates per-iteration leak");
};

done_testing();



( run in 1.794 second using v1.01-cache-2.11-cpan-71847e10f99 )