## 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