On 8/10/07, Donald Bruce Stewart <dons@cse.unsw.edu.au> wrote:
No, STUArray s Int Bool is a bit array.
Look at the space use. Or try replacing Bool with Word32, and see what happens.
Fair enough. Well, the mono example in the shootout is lacking quite a few optimizations, eg its using the builtin BitArray (slowww....), and it's not checking for the value of the bits before writing them. I dont quite get as fast as your ghc version (yet ;-) ), but its within 10% on my machine, using Microsoft C#, and staying within the rules of the shootout.
G:\dev\haskell>primeshootoutmono3
Primes up to 10240000 679461
elapsed time: 0.921875
G:\dev\haskell>primeshootoutghc
Primes up to 10240000 679461
0.8280000000000001
class NSieveBits
{
public int nsieve(int m) {
int[] isNotPrime = new int[((m+1) >> 5) + 1];
int count = 0;
int wordindex = 0;
int bitmask = 4;
for (int i=2; i <= m; i++)
{
//Console.WriteLine( i + " " + wordindex + " " + bitmask );
if ( ( isNotPrime[wordindex] & bitmask ) == 0 )
{
//Console.WriteLine("prime: " + i );
for (int k = (i << 1); k <= m; k+=i)
{
int _wordindex = k >> 5;
int _bitmask = 1 << ( k & 31 );
int _thisword = isNotPrime[_wordindex];
if( ( _thisword & _bitmask ) == 0 )
{
isNotPrime[ _wordindex ] = _thisword | _bitmask;
}
}
count++;
}
if( bitmask == ( 1 << 31 ) )
{
wordindex++;
bitmask = 1;
}
else
{
bitmask <<= 1;
}
}
return count;
}
}
It'd be more interesting to run these things in a multicore environment (16 cores would be ok, 64 would be better). Are there any utilities out there to do this? (vmware???)