> Hmmm ... I feel a benchmark coming on ...
> Mine is about 10% faster. Not much of a difference really.
Beware the benchmark. Different datasets and CPU loads will yield different
results.
use Benchmark qw(cmpthese timethese);
my @tree;
my $zero = { a => "0", b => "0" };
my $one = { a => "1", b => "1" };
push @tree, $zero, $one, $zero, $one;
# alan random orders the stringification of the hashrefs
# greg sorts the uniques
# paul random orders the uniques
sub alan { my @unique = do { my %s; @s{ @tree } = ''; keys %s } }
sub greg { my @unique = do { my %s; grep { ! $s{ $_ }++ } @tree } }
sub paul { my @unique = do { my %s; @s{ @tree } = @tree; values %s } }
cmpthese timethese(-10, {
greg => \&greg,
alan => \&alan,
paul => \&paul,
});
[EMAIL PROTECTED]:~$ perl /home/paul/foo
Benchmark: running alan, greg, paul for at least 10 CPU seconds...
alan: 18 wallclock secs (10.29 usr + 0.00 sys = 10.29 CPU) @ 93772.50/s
(n=964919)
greg: 18 wallclock secs (10.38 usr + 0.00 sys = 10.38 CPU) @ 96677.84/s
(n=1003516)
paul: 18 wallclock secs (10.33 usr + 0.02 sys = 10.35 CPU) @ 95057.00/s
(n=983840)
Rate alan paul greg
alan 93772/s -- -1% -3%
paul 95057/s 1% -- -2%
greg 96678/s 3% 2% --
Greg's is marginally faster. But it is arguably the more correct of the three
implementations (if you run the test on my box with this limited data set).
Paul
/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/