标题:strcpy函数怎么写
只看楼主
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
[bo]以下是引用 [un]StarWing83[/un] 在 2008-5-14 19:52 的发言:[/bo]

加快速度?很简单嘛,直接当作int,一次复制四个字节,速度自然快了……

Bingo!答案就这么简单

[color=white]
2008-05-14 19:56
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
......

樱花大战,  有爱.
2008-05-14 20:01
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
我两头一起复制呢?

樱花大战,  有爱.
2008-05-14 20:02
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
虽然说是这么说,不过实现起来也不容易的,有空的话就码一下吧

[color=white]
2008-05-14 20:05
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
测试数据: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;
}

樱花大战,  有爱.
2008-05-14 20:08
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
两头复制,复杂度仍然是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
2008-05-14 20:11
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
虽然是O(n),但是也快了啊~

樱花大战,  有爱.
2008-05-14 20:12
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
不明白,照理说是快不了的。
同样是byte复制,而且因为循环内相差甚远,不止会增加寄存器的使用,而且会导致cache失效,应该速度不会提高才对……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-14 20:19
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
而且因为strlen的使用,似乎应该慢一些才对………………

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-14 20:20
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
[bo]以下是引用 [un]StarWing83[/un] 在 2008-5-14 20:11 的发言:[/bo]
两头复制,复杂度仍然是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;
}

随便码了个,不知道对不对……


你这个代码比二楼的直接复制还要慢得多

[color=white]
2008-05-14 20:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-214249-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036624 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved