Attached the source of my benchmark program in case anyone wants to have a look at it.
-- Francois Gouget [EMAIL PROTECTED] http://fgouget.free.fr/ We are Pentium of Borg. You will be approximated. Division is futile.
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <time.h> static char pattern[]="qwertyuiopoasdfhgjklzxcvnbmn"; static char filename[]="Filename.txt"; static char extension[]="rej"; char* mystrcpy(char* dst,char* src) { char* d=dst; while (*src) *d++=*src++; *d='\0'; return dst; } char* mystrcat(char* dst,char* src) { char* d=dst; while (*d!='\0') d++; while (*src!='\0') *d++=*src++; *d='\0'; return dst; } char* cpycat(char* dst,char* src) { while (*src!='\0') *dst++=*src++; *dst='\0'; return dst; } int main(int argc, char** argv) { int len; char* path; char* buf; char* b; int i; struct timeval start,stop; int elapsed; if (argc!=2) { fprintf(stderr,"Usage: sprintf length\n"); return 2; } len=atoi(argv[1]); if (len==-1) { fprintf(stderr,"bad length\n"); return 1; } path=malloc(len+1); buf=malloc(len+1+100+1); for (i=0;i<len;i++) { path[i]=pattern[i % (sizeof(pattern)-1)]; } path[len]='\0'; printf("len=%d\n",strlen(path)); /***** The 3 strings case *****/ printf("3 strings case\n"); /* Test sprintf */ for (i=0;i<10;i++) { /* warm up */ sprintf(buf,"%s/%s",path,filename); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { sprintf(buf,"%s/%s",path,filename); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("sprintf: elapsed=%5d\n",elapsed); /* Test strcat */ for (i=0;i<10;i++) { /* warm up */ strcpy(buf,path); strcat(buf,"/"); strcat(buf,filename); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { strcpy(buf,path); strcat(buf,"/"); strcat(buf,filename); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("strcat: elapsed=%5d\n",elapsed); /* Test mystrcat */ for (i=0;i<10;i++) { /* warm up */ mystrcpy(buf,path); mystrcat(buf,"/"); mystrcat(buf,filename); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { mystrcpy(buf,path); mystrcat(buf,"/"); mystrcat(buf,filename); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("mystrcat: elapsed=%5d\n",elapsed); /* Test cpycat */ for (i=0;i<10;i++) { /* warm up */ b=buf; b=cpycat(b,path); b=cpycat(b,"/"); b=cpycat(b,filename); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { b=buf; b=cpycat(b,path); b=cpycat(b,"/"); b=cpycat(b,filename); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("cpycat: elapsed=%5d\n",elapsed); /***** The 5 strings case *****/ printf("5 strings case\n"); /* Test sprintf */ for (i=0;i<10;i++) { /* warm up */ sprintf(buf,"%s/%s.%s",path,filename,extension); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { sprintf(buf,"%s/%s.%s",path,filename,extension); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("sprintf: elapsed=%5d\n",elapsed); /* Test strcat */ for (i=0;i<10;i++) { /* warm up */ strcpy(buf,path); strcat(buf,"/"); strcat(buf,filename); strcat(buf,"."); strcat(buf,extension); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { strcpy(buf,path); strcat(buf,"/"); strcat(buf,filename); strcat(buf,"."); strcat(buf,extension); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("strcat: elapsed=%5d\n",elapsed); /* Test mystrcat */ for (i=0;i<10;i++) { /* warm up */ mystrcpy(buf,path); mystrcat(buf,"/"); mystrcat(buf,filename); mystrcat(buf,"."); mystrcat(buf,extension); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { mystrcpy(buf,path); mystrcat(buf,"/"); mystrcat(buf,filename); mystrcat(buf,"."); mystrcat(buf,extension); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("mystrcat: elapsed=%5d\n",elapsed); /* Test cpycat */ for (i=0;i<10;i++) { /* warm up */ b=buf; b=cpycat(b,path); b=cpycat(b,"/"); b=cpycat(b,filename); b=cpycat(b,"."); b=cpycat(b,extension); } gettimeofday(&start,NULL); for (i=0;i<50000;i++) { b=buf; b=cpycat(b,path); b=cpycat(b,"/"); b=cpycat(b,filename); b=cpycat(b,"."); b=cpycat(b,extension); } gettimeofday(&stop,NULL); elapsed=(stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec); printf("cpycat: elapsed=%5d\n",elapsed); return 0; }