#include<stdio.h>
#define GLIBC_STRCPY
//#define MY_STRCPY2
//#define MY_STRCPY3
//#define MY_STRCPY4
/*没有考虑 dest src 指向同一内存地址 的情况*/
char *my_strcpy1(char *dest, const char *src)
{
char *d = dest;
do{
*d++ = *src;
}while('\0' != *src++);
return dest;
}
char *my_strcpy2(char *dest, const char *src)
{
char *d = dest;
register char c;
do{
c = *src++;
*d++ = c;
}while('\0' != c);
return dest;
}
char *my_strcpy3(char *dest, const char *src)
{
char *tmp = dest;
while((*dest++ = *src++) != '\0')
;
return tmp;
}
/* Copy SRC to DEST*/
char *
glibc_strcpy(dest, src)
char *dest;
const char *src;
{
register char c;
char *s = (char *)src;
const int off = dest - s - 1;//- 1;
do{
c = *s++;
s[off] = c;
}while(c != '\0');
return dest;
}
#ifdef MY_STRCPY4
char *my_strcpy4(char *dest, const char *src)
{
register char c;
char *s = (char *)src;
const int off = dest - s - 1;
do{
c = *s++;
s[off] = c;
}while('\0' != c);
return dest;
}
#endif
int main(int argc, char **argv)
{
const char *ptr = "hello world";
char array[20] ;
unsigned int i;
#ifdef GLIBC_STRCPY
for(i = 0; i < 6553500; i++){
glibc_strcpy(array, ptr);
glibc_strcpy(array, ptr);
}
puts("glibc_strcpy");
#endif
#ifdef MY_STRCPY2
for(i = 0; i < 6553500; i++){
my_strcpy2(array, ptr);
my_strcpy2(array, ptr);
}
puts("my_strcpy2");
#endif
#ifdef MY_STRCPY3
for(i = 0; i < 6553500; i++){
my_strcpy3(array, ptr);
my_strcpy3(array, ptr);
}
puts("my_strcpy3");
#endif
#ifdef MY_STRCPY4
for(i = 0; i < 6553500; i++){
my_strcpy4(array, ptr);
my_strcpy4(array, ptr);
}
puts("my_strcpy4");
#endif
return 0;
}
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
glibc_strcpy
real 0m1.224s
user 0m1.104s
sys 0m0.008s
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
glibc_strcpy
real 0m1.213s
user 0m1.124s
sys 0m0.004s
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
glibc_strcpy
real 0m1.286s
user 0m1.168s
sys 0m0.000s
lihacker@lihacker-laptop:/home/c_test$ vim strcpy2.c
lihacker@lihacker-laptop:/home/c_test$ gcc strcpy2.c -o strcpy2
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
my_strcpy2
real 0m0.973s
user 0m0.924s
sys 0m0.004s
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
my_strcpy2
real 0m0.915s
user 0m0.872s
sys 0m0.000s
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
my_strcpy2
real 0m0.944s
user 0m0.848s
sys 0m0.004s
lihacker@lihacker-laptop:/home/c_test$ vim strcpy2.c
lihacker@lihacker-laptop:/home/c_test$ gcc strcpy2.c -o strcpy2
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
my_strcpy3
real 0m1.438s
user 0m1.292s
sys 0m0.000s
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
my_strcpy3
real 0m1.441s
user 0m1.364s
sys 0m0.000s
lihacker@lihacker-laptop:/home/c_test$ time ./strcpy2
my_strcpy3
real 0m1.424s
user 0m1.304s
sys 0m0.000s