编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛  
 
全能 ASP / PHP / ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
发新话题
打印

strcpy函数怎么写

本主题由 死了都要C 于 2008-5-15 16:55 下沉
引用:
以下是引用 StarWing83 在 2008-5-14 19:52 的发言:

加快速度?很简单嘛,直接当作int,一次复制四个字节,速度自然快了……
Bingo!答案就这么简单

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

TOP

......
汇编.....

TOP

我两头一起复制呢?
汇编.....

TOP

虽然说是这么说,不过实现起来也不容易的,有空的话就码一下吧

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

TOP

测试数据:10W
_strcpy():
4218 ms
strcpy_():
7360 ms


_strcpy():
4109 ms
strcpy_():
7313 ms


_strcpy():
4078 ms
strcpy_():
7312 ms


_strcpy():
4235 ms
strcpy_():
7468 ms


_strcpy():
4344 ms
strcpy_():
7422 ms


_strcpy():
4141 ms
strcpy_():
7343 ms


_strcpy():
4094 ms
strcpy_():
7328 ms


_strcpy():
4125 ms
strcpy_():
7281 ms


_strcpy():
4094 ms
strcpy_():
7344 ms


_strcpy():
4109 ms
strcpy_():
7312 ms
虽然用到了strlen()......
复制内容到剪贴板
代码:
#include <fstream>
#include<ctime>
#include<cassert>
#include<cstring>
using namespace std;

char* _strcpy(char* target,const char * source)
{
    assert(target!=NULL&&source!=NULL);
    char* str= target;
    while(*target++=*source++);
    return str;
}
char* strcpy_(char* target,const char* source)
{
      assert(target!=NULL&&source!=NULL);
      int n = strlen(source);
      char* str=target;
      const char* end_source = source+n-1;
      char* end_target = target+n;
      *end_target-- = '\0';
      while(source<end_source)
      {
          *target++ = *source++;
          *end_target-- = *end_source--;
      }
      if(n&1) *target++=*source,*target=*(end_source+1);
      return str;
}
ofstream out("lov.out");
int main(void)
{
    char a[100000];
    char b[100000];
    b[100000-1]='\0';
    for(int m=0;m<10;++m)
    {
      out<<"\n\n";
      out<<"_strcpy(): \n";
      clock_t t_=clock();
      for(int k=0;k<10000;++k)
        strcpy_(a,b);
      out<<clock()-t_<<" ms"<<endl;
       out<<"strcpy_(): \n";
      clock_t t=clock();
      for(int j=0;j<10000;++j)
        _strcpy(a,b);
      out<<clock()-t<<" ms"<<endl;
    }
    out.close();
    return 0;
}
汇编.....

TOP

两头复制,复杂度仍然是n……

char* str_cpy(char* dest,const char* src)
{
    assert(dest != NULL && src != NULL);
    char *str=dest;
    while (src[0] && src[1] && src[2] && src[3])
        *(int*)dest++ = *(int*)src++;
    while (*dest++ = *src++);//s这里写NULL;GCC会给出警告:语句无意义。
    return str;
}

随便码了个,不知道对不对……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

虽然是O(n),但是也快了啊~
汇编.....

TOP

不明白,照理说是快不了的。
同样是byte复制,而且因为循环内相差甚远,不止会增加寄存器的使用,而且会导致cache失效,应该速度不会提高才对……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

而且因为strlen的使用,似乎应该慢一些才对………………
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

引用:
以下是引用 StarWing83 在 2008-5-14 20:11 的发言:
两头复制,复杂度仍然是n……

char* str_cpy(char* dest,const char* src)
{
    assert(dest != NULL && src != NULL);
    char *str=dest;
    while (src[0] && src[1] && src[2] && src[3])
        *(int*)dest++ = *(int*)src++;
    while (*dest++ = *src++);//s这里写NULL;GCC会给出警告:语句无意义。
    return str;
}

随便码了个,不知道对不对……
你这个代码比二楼的直接复制还要慢得多

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

TOP

发新话题