use Benchmark 'cmpthese'; my @swapthese; sub xor_swap { my ($x,$y)=@swapthese; $x ^= $y; $y ^= $x; $x ^= $y; ($x,$y); } sub perl_swap { my ($x,$y)=@swapthese; ($x,$y) = ($y,$x); ($x,$y); } sub perl_i_swap { my ($x,$y)=@swapthese; ($x,$y) = ($y^0,$x^0); ($x,$y); } { my $tmp; sub tmp_swap { my ($x,$y)=@swapthese; $tmp=$x; $x=$y; $y=$tmp; ($x,$y); } sub tmp_i_swap { my ($x,$y)=@swapthese; $tmp=$x^0; $x=$y^0; $y=$tmp; ($x,$y); } } sub ret_swap { my ($x,$y)=@swapthese; ($y,$x); } sub ret_i_swap { my ($x,$y)=@swapthese; $x ^= 0; $y ^= 0; ($y,$x); } for my $S ([38,970], [38.1,970], ['foo',38], ['foo','barbell']) { @swapthese = @$S; print "Swapping @swapthese\n"; print "XOR: @{[xor_swap()]}\n"; print "Perl: @{[perl_swap()]}\n"; print "Perl I: @{[perl_i_swap()]}\n"; print "TMP: @{[tmp_swap()]}\n"; print "TMP I: @{[tmp_i_swap()]}\n"; print "RET: @{[ret_swap()]}\n"; print "RET I: @{[ret_i_swap()]}\n"; cmpthese (-2, { xor_swap => \&xor_swap, perl_swap => \&perl_swap, tmp_swap => \&tmp_swap, ret_swap => \&tmp_swap, perl_i_swap => \&perl_swap, tmp_i_swap => \&tmp_swap, ret_i_swap => \&tmp_swap, }); }