#!/usr/bin/perl use strict; use warnings; use Benchmark qw( timethese cmpthese ); my @doCount = (0); # total loops until unique array generated my $range = 120; # numbers range from 0 to $range my $aSize = 1000000; # random pool array size my $uSize = 100; # unique array size my ( @grep, @map, @smart ); my @nums = arrGen(); # generate huge pool of random numbers my $r = timethese( 2500, { grepGen => sub{ @grep = grepGen(); }, mapGen => sub{ @map = mapGen(); }, smartGen => sub{ @smart = smartGen(); }, } ); # show results cmpthese $r; print "loop counts - grep: $doCount[0], map: $doCount[1], smart: $doCount[2]\n"; print "array sizes - num: ", scalar(@nums), # should all == $uSize "; grep: ", scalar(@grep), "; map: ", scalar(@map), "; smart: ", scalar(@smart), "\n"; # show sorted generated arrays to check for a rare duplicate print "grep:\n@{[sortIt(@grep)]}\nmap:\n@{[sortIt(@map)]}\nsmart:\n@{[sortIt(@smart)]}\n"; sub arrGen { my @nArray; for ( 1..$aSize ) { my $rInt = int(rand($range)); push @nArray, $rInt; } return @nArray; } sub sortIt { return sort { $a <=> $b } @_; } sub grepGen { my $idx = 0; my @gArray; for ( 1..$uSize ) { $doCount[0]++; my $rInt = $nums[$idx++]; redo if ( @gArray && grep { /$rInt/ } @gArray ); push @gArray, $rInt; } return @gArray; } sub mapGen { my $idx = 0; my @mArray; for ( 1..$uSize ) { $doCount[1]++; my $rInt = $nums[$idx++]; redo if ( @mArray && map { /$rInt/ } @mArray ); push @mArray, $rInt; } return @mArray; } sub smartGen { my $idx = 0; my @sArray; for ( 1..$uSize ) { $doCount[2]++; my $rInt = $nums[$idx++]; redo if ( @sArray && $rInt ~~ @sArray ); push @sArray, $rInt; } return @sArray; }