Ignore:
Timestamp:
3/11/2008 4:31:27 AM (6 years ago)
Author:
lowjoel
Message:

Optimized copy algorithm.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eraser6/DefaultPlugins/ISAAC.cs

    r206 r217  
    3131                { 
    3232                    //Generate 256 ints. 
    33                     isaac.Isaac(); 
     33                    if (isaac.count == 0) 
     34                        isaac.Isaac(); 
    3435 
    3536                    //Copy the data. 
    3637                    fixed (int* src = isaac.rsl) 
    37                     fixed (byte* dest = buffer) 
     38                    fixed (byte* dest = &buffer[bytesGenerated]) 
    3839                    { 
    39                         byte* bSrc = (byte*)src; 
    40                         int bytesToCopy = Math.Min(Rand.ISAAC.SIZE, buffer.Length), 
    41                             randArraySize = isaac.rsl.Length * sizeof(int); 
     40                        //Advance to the end of the array of unused randomness. 
     41                        //byte* bSrc = (byte*)src; 
     42                        byte* pSrc = (byte*)(src + isaac.count); 
     43                        byte* pDest = dest; 
    4244 
    43                         for (int i = 0; i < randArraySize && i < bytesToCopy; ++i) 
    44                             dest[i] = bSrc[i]; 
     45                        //Copy four bytes at a time, moving the source pointer backwards, 
     46                        //and the destination pointer forwards. 
     47                        int bytesToCopy = Math.Min(isaac.count * sizeof(int), 
     48                            buffer.Length - bytesGenerated); 
     49                        while (bytesToCopy >= 4) 
     50                        { 
     51                            pSrc -= sizeof(int); 
     52                            *(int*)pDest = *(int*)pSrc; 
     53                            pDest += sizeof(int); 
     54 
     55                            bytesToCopy -= sizeof(int); 
     56                            --isaac.count; 
     57                        } 
     58 
     59                        //Copy the remaining bytes over. 
     60                        if (bytesToCopy != 0) 
     61                        { 
     62                            while (bytesToCopy-- != 0) 
     63                                *pDest++ = *pSrc--; 
     64                            --isaac.count; 
     65                        } 
    4566                    } 
    4667                } 
Note: See TracChangeset for help on using the changeset viewer.