## Gen a file of 100e6 random ints:1 .. 999 perl -E"say 1+ int( rand 999 ) for 1 .. 100e6" > rands.dat ## Now count them using IO and a hash and write the counts to a file: [22:59:34.88] c:\test>perl -nlE"++$h{ $_ } }{ say qq[$_ :: $h{ $_ }] for sort{$a<=>$b} keys %h" rands.dat > hash.res [23:00:16.83] c:\test> rem 41.95 seconds ## Same thing using an array: [23:06:58.13] c:\test>perl -nlE"++$h[ $_ ] }{ say qq[$_ :: $h[ $_ ]] for 0 .. $#h" rands.dat > array.res [23:07:38.02] c:\test> rem 39.49 seconds #### [ 0:37:15.07] c:\test>perl -nE"$a[$.-1]=0+$_" rands.dat [ 0:47:23.27] c:\test> #### #! perl -slw use strict; use Inline C => Config => BUILD_NOISY => 1; use Inline C => <<'END_C', NAME => 'junk1_IC', CLEAN_AFTER_BUILD => 0; IV initSieve( int size ) { int *sieve; Newxz( sieve, size, int ); if( !sieve ) croak( "ints_per_bucket: Couldn't allocate memory.\n" ); return (IV)sieve; } void sieve( IV psieve, int val ) { int *sieve = (int*)psieve; ++sieve[ val ]; return; } void sieveStats( IV psieve, int size ) { Inline_Stack_Vars; int *sieve = (int*)psieve; int i; Inline_Stack_Reset; for( i = 0; i < size; ++i ) { Inline_Stack_Push( sv_2mortal( newSViv( sieve[ i ] ) ) ); } Inline_Stack_Done; } void freeSieve( IV psieve ) { int *sieve = (int*)psieve; if( sieve ) Safefree( sieve ); return; } END_C use Data::Dump qw [ pp ]; my $sieve = initSieve( 999 ); sieve( $sieve, 0+$_ ) while <>; my @res = sieveStats( $sieve, 999 ); pp \@res; freeSieve( $sieve ); #### [ 0:32:32.61] c:\test>junk1-ic rands.dat 2>nul [ 0:33:28.69] c:\test>rem 56.08 seconds