#! /usr/bin/perl use strict; use warnings; use Benchmark 'cmpthese'; use List::MoreUtils 'zip'; # Hands up if you can predict the result? :) sub zip1 { my @list1 = @{shift()}; my @list2 = @{shift()}; my @zip; while (@list1+@list2) { push(@zip, shift(@list1), shift(@list2)); } @zip } sub zip2 { my( $r1, $r2 ) = @_; map { $r1->[ $_ ], $r2->[ $_ ] } 0 .. ( $#$r1 > $#$r2 ? $#$r1 : $#$r2 ); } for my $length (10, 1000, 10000000) { my @a = 1 .. $length; my @b = reverse @a; print "For $length elements:\n"; cmpthese(-10, { copy => 'zip1 \@a, \@b', deref => 'zip2 \@a, \@b', CPAN => 'zip @a, @b', }); print "\n"; } #### For 10 elements: Rate deref copy CPAN deref 672475/s -- -15% -67% copy 795069/s 18% -- -62% CPAN 2066450/s 207% 160% -- For 1000 elements: Rate deref copy CPAN deref 671925/s -- -14% -68% copy 781043/s 16% -- -62% CPAN 2071516/s 208% 165% -- For 10000000 elements: Rate deref copy CPAN deref 653053/s -- -15% -68% copy 771081/s 18% -- -62% CPAN 2045217/s 213% 165% --