ebmDevMag.com home
ebm Developer's Magazine
links

developer's mag
main page

article
part 1
part 2
part 3
part 4
part 5
part 6
part 7
part 8
part 9


3 - Another Try...

After coding these changes we get the following:
void PerformSieve2(unsigned char *array,int limit)
{
  // define variables outside of loops, including precalc loop limit
  int calculatedLimit=limit/3, i=0, k=0, byte=0, bit=0;
  for ( i=3;i<calculatedLimit;i+=2) // skip even numbers
  {
    for ( k=i+i+i; k<limit; k+=i+i ) // skip every even multiple
    {
      // mark item 'k' as non-prime
      byte=k>>4; // quick way of dividing by 16
      bit=(k>>1)&0x07;
      m_bitArray[byte] |= 1<<bit;
    }
  }
}
The source code accompanying this column includes these two functions as well as the final assembly language function. Even in the C code, the performance gain is significant, with about three times the speed for the optimized C.

With all this analysis out of the way, we can make the move into assembly language. By working in this stepwise fashion, we benefit from optimizing code in an easier language, as well as giving us a version we can use to test the accuracy of the final assembly version.

Previous Section
Next Section

Copyright © 2001-2006 ebmDevMag.com - Legal Notice