Path: utzoo!attcan!uunet!ingr!jones From: jones@ingr.UUCP (Mark Jones) Newsgroups: comp.lang.c Subject: "conventional" copy fragment? Message-ID: <2585@ingr.UUCP> Date: 21 Sep 88 16:03:26 GMT References: <8809092109.AA06071@tycho.yerkes.uchicago.edu> Organization: Intergraph Corp. Huntsville, Al Lines: 62 Re: Writing Trashy efficient code (digression from Duff's device.) In article <8809092109.AA06071@tycho.yerkes.uchicago.edu>, pearce@TYCHO.YERKES.UCHICAGO.EDU ("Eric C. Pearce") writes: > > Personally, I prefer this "conventional" copy fragment: > > A = array1; > B = array2; > > n = Count / 8; > for (i = Count%8; i > 0; i--) > *A++ = *B++; > while (--n >= 0) { > *A++ = *B++; > *A++ = *B++; > *A++ = *B++; > *A++ = *B++; > *A++ = *B++; > *A++ = *B++; > *A++ = *B++; > *A++ = *B++; > } > > >From a performance standpoint, it falls only 2% behind duff device and > is 102% more readable and not "kludgy". How about this "conventional" copy fragment memcpy(array2,array1,sizeof(*A)*Count); /* copy array1 to array2 */ Almost every system has this call (I have never seen one that didn't) and if it was implemented well, it could be done in as few as 7 instructions, on a brain damaged microprocessor. mov cx,{Count| shl cx,1 /* for 2 byte objects */ shl cx,1 /* for 4 byte objects */ mov si,{address of array1} mov di,{address of array2} repnz movsw /* done */ or mov.l a0,?(a7) mov.l a1,?(a7) mov.? d0,Count; /* shift left once or twice */ loop: mov.b (a0)+,(a1)+ dbnz loop /* i don't remember the exact syntax here */ Mark Jones PS I don't guarantee syntax, but you should get the idea. Use the functions in the C library. If you need more speed, recode the library routines in assembly, and link them in ahead of the standard library. Don't write trashy C code to try to get better speed. It just ain't worth it, now or later. PPS Yes, I know the 68000 code could be made even better, very easily, (should check for alignment, use bigger moves, etc...) but this is only an example.