use strict; use warnings; use Benchmark qw( cmpthese ); my @list = ('1')x10; sub equal_pm {@_ < 2 || $_[0] eq $_[1] && equal_pm(@_[1..$#_])} sub equal_i { return 1 if @_ < 2; return 0 if $_[0] ne $_[1]; shift; goto(&equal_i); } sub equal_i2 { while (@_ >= 2) { return 0 if $_[0] ne $_[1]; shift; } return 1; } cmpthese(-3, { equal_pm => sub { my $rv = equal_pm(@list) ?1:0; 1; }, equal_i => sub { my $rv = equal_i (@list) ?1:0; 1; }, equal_i2 => sub { my $rv = equal_i2(@list) ?1:0; 1; }, });