Hey, I just realized I can shave off another 30% in C# ;-)<br><br>So now the timings become:<br><br>Safe Haskell<br>=========<br><br>J:\dev\haskell>ghc -O2 -o primechaddai.exe PrimeChaddai.hs<br><br>J:\dev\haskell>primechaddai
<br>number of primes: 664579<br>Elapsed time: 26.234<br><br>Unsafe Haskell<br>===========<br><br>J:\dev\haskell>ghc -fglasgow-exts -O2 -o PrimeDonald2.exe PrimeDonald2.hs<br><br>J:\dev\haskell>primedonald2<br>number of primes: 664579
<br>Elapsed time: 0.7030000000000001<br><br>mono<br>====<br><br>J:\dev\test\testperf>erase primecs.exe & gmcs primecs.cs<br><br>J:\dev\test\testperf>mono primecs.exe<br>number of primes: 664579<br>elapsed time: 0,453
<br><br>Microsoft.Net<br>==========<br><br>J:\dev\test\testperf>erase primecs.exe & csc /nologo primecs.cs<br><br>J:\dev\test\testperf>primecs<br>number of primes: 664579<br>elapsed time: 0,421875<br><br>Here's the fabulously complicated ;-) new C# algorithm:
<br><br> public int CalculateNumberOfPrimes( int maxprime )<br> {<br> bool[]IsNotPrime = new bool[ maxprime ]; <br> int NumberOfPrimes = 1;<br><br> int squarecutoff = (Int32)Math.Sqrt( maxprime ) + 1;
<br> for( int i = 3; i < maxprime; i+= 2 )<br> {<br> if( !IsNotPrime [i] )<br> {<br> NumberOfPrimes++;<br> if( i < squarecutoff )<br> {
<br> for( int j = ( i << 1 ); j < maxprime; j+= i )<br> {<br> if( !IsNotPrime [j] )<br> IsNotPrime [ j] = true;<br> }<br> }
<br><br> }<br> }<br> return NumberOfPrimes;<br> }<br><br>(basically, we only cross off primes up to the square root of the size of the grid. I think this is a standard part of the standard Arostophenes grid algorithm, so like I say the C# version is seriously unoptimized ;-) )
<br><br>