学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
轻松建立自己的群组,招兵买马   
发新话题
打印

strcpy函数怎么写

本主题由 死了都要C 于 2008-5-15 16:55 下沉
不会吧……Orz我内嵌汇编得了……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

足足是二楼代码的时间的3.8倍

C/C++讨论群:46520219 3996098 21035626 57909089
免费的C/C++算法学习论坛:http://yzfy.org

TOP

char* str_cpy(char* dest,const char* src)
{
    assert(dest != NULL && src != NULL);

    char *str=dest;
    int *pd=(int*)dest,*ps=(int*)src;
    while (*ps&0xff && *ps&0xff00 && *ps&0xff0000 && *ps&0xff000000)
        *pd++=*ps++;
    for (dest=(char*)pd,src=(char*)ps;*dest++=*src++;);
    return str;
}


一千万个字符,比标准库慢1ms,比直接复制快2ms……Orz……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

啊啊啊啊……GCC的优化太差劲了……换VC9编译器……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

str_cpy Uses time 79ms
str_cpy2 Uses time 176ms
strcpy Uses time 167ms
VC9编译的结果,str_cpy2是直接复制……不知道该说什么了……
请按任意键继续. . .
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

str_cpy Uses time 105ms
str_cpy2 Uses time 116ms
strcpy Uses time 95ms
请按任意键继续. . .

完全一样的代码,GCC的结果……可以看出VC9优化过的版本,比GCC的库函数还要快……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

以上两楼数据是复制100M数据的结果……代码如下:
#include <iostream>
#include <cassert>
#include <ctime>


char* str_cpy(char* dest,const char* src)
{
    assert(dest != NULL && src != NULL);

    char *str=dest;
    int *pd=(int*)dest,*ps=(int*)src;
    while (*ps&0xff && *ps&0xff00 && *ps&0xff0000 && *ps&0xff000000)
        *pd++=*ps++;
    for (dest=(char*)pd,src=(char*)ps;*dest++=*src++;);
    return str;
}

char* str_cpy2(char* dest,const char* src)
{
    assert(dest != NULL && src != NULL);
    char *str=dest;
    while (*dest++ = *src++);
    return str;
}

#define N 100000000
char a[N],s[N],d[N];

#define Test(strcpy) \
    do { \
        for(int i=0;i<N;i++)a[i]=s[i],d[i]=0; \
        clock_t t=clock(); \
        strcpy(d,a); \
        printf(#strcpy" Uses time %ldms\n",clock()-t); \
    } while(0)

int main(void)
{
    for (int i=0;i<N;i++)s[i]=rand()%255+1;
    s[N-1]=0;

    Test(str_cpy);
    Test(str_cpy2);
    Test(strcpy);

    return 0;
}
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

引用:
以下是引用 雨中飛燕 在 2008-5-14 19:42 的发言:

你要是你觉得你很牛那你写一个内嵌汇编的版本发来看看
你用c我用汇编,咱们比比如何?
Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.

TOP

怎么我刚回来,爱吹牛的小妹妹就躲起来了?
Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.

TOP

加速的方法早已公布了,你要是利用刚刚所说的方法去写汇编,
超越C代码的速度根本不难
你有本事就用二楼的代码改写汇编来较量呗

C/C++讨论群:46520219 3996098 21035626 57909089
免费的C/C++算法学习论坛:http://yzfy.org

TOP

发新话题