The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Benchmark qw(cmpthese);

use Sub::Recursive;

use vars qw/ $rec /;

sub manual_recursive {
    my $_foo = sub { @_ ? $_[0] + $rec->(@_[1 .. $#_]) : 0 };
    return sub {
        local $rec = $_foo;
        $_foo->(@_);
    };
}

sub leaker {
    my $_foo;
    $_foo = sub { @_ ? $_[0] + $_foo->(@_[1 .. $#_]) : 0 };
    return $_foo;
}

my $leaker = leaker();
my $manual = manual_recursive();
my $recursive = recursive { @_ ? $_[0] + $REC->(@_[1 .. $#_]) : 0 };

my @vals = 1 .. 50;

cmpthese(-10, {
    leaker => sub { $leaker->(@vals) },
    manual => sub { $manual->(@vals) },
    recursive => sub { $recursive->(@vals) },
});

__END__
            Rate    manual recursive    leaker
recursive 1447/s        --       -0%       -0%
manual    1449/s        0%        --       -0%
leaker    1454/s        0%        0%        --


This is perl, v5.8.0 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2002, Larry Wall

Binary build 806 provided by ActiveState Corp. http://www.ActiveState.com
Built 00:45:44 Mar 31 2003