Unfortunately, your benchmark is wrong. As the array @unsorted is lexical, it isn't visible within the benchmark code, so the subs are uniquifying an empty array. All your benchmark is measuring is how quickly the sub return nothing. Correcting that, I get these results.
#!perl -w use strict; use Benchmark ':all'; our @unsorted = map { join('', map { ('a'..'z','A'..'Z',0..9)[rand 62] } 1..50) } 1..5000; sub uniq_dragonchild { my %x; @x{@_} = @_; values %x } sub uniq_BrowserUk { my %x; @x{@_} = (); keys %x } sub uniq_Zaxo { keys %{ { map { $_ => undef } @_ } } } sub uniq_Roy { my %x; grep {!$x{$_}++} @_ } our( @a, @b, @c, @d ); cmpthese( -1, { uniq_dragonchild => '@a = uniq_dragonchild( @unsorted )', uniq_BrowserUk => '@b = uniq_BrowserUk( @unsorted )', uniq_Zaxo => '@c = uniq_Zaxo(@unsorted)', uniq_Roy => '@d = uniq_Roy( @unsorted )', }); #my $a='a'; print $/, $a++, ' : ', "@{[ sort @$_ ]}" for ( \@a, \@b, \ +@c, \@d ); __END__ P:\test>363760 Rate uniq_dragonchild uniq_Zaxo uniq_Roy uniq +_BrowserUk uniq_dragonchild 18.1/s -- -21% -31% + -41% uniq_Zaxo 22.8/s 26% -- -13% + -25% uniq_Roy 26.3/s 45% 15% -- + -14% uniq_BrowserUk 30.6/s 69% 34% 16% + --
In reply to Re^4: promoting array to a hash
by BrowserUk
in thread promoting array to a hash
by sleepingsquirrel
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |