walter@garth.UUCP (Walter Bays) (07/16/88)
register long count; register long *src, *dst; while( --count ) { *dst++ = *src++; } In article <1746@vaxb.calgary.UUCP> radford@calgary.UUCP (Radford Neal) writes: >Your problem is that the above C code is grossly non-optimal. Assuming >that "count" is typically fairly large, the optimal C code is the >following: > bcopy ((char*)src, (char*)dst, count*sizeof(long)); >If for some bizzare reason your C comiler doesn't come with a "bcopy" >routine, I suggest [unrolling the loop] Neal trusts the library routine to be at least as fast as what he can write in C. Bcopy should use an unrolled loop, and should do a word copy if allignment is right, byte copy if not. You can probably even arrange to guarantee word allignment. Since speed is important here, I'd use something like: assert ((unsigned)src & 3 == 0 && (unsigned)dst & 3 == 0); bcopy ((char*)src, (char*)dst, count*sizeof(long)); >There are, of course, many variations, and it's hard to tell which will >be best on any particular processor, which is why "bcopy" was invented. A smart compiler could inline the bcopy for small counts. It could even use the assertion to bypass the run-time allignment-checking code. All of which gets back to the previous poster's point: use the library. -- ------------------------------------------------------------------------------ My opinions are my own. Objects in mirror are closer than they appear. E-Mail route: ...!pyramid!garth!walter (415) 852-2384 USPS: Intergraph APD, 2400 Geng Road, Palo Alto, California 94303 ------------------------------------------------------------------------------