BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 



用了论坛里面的一段汇编strcpy,比c自建的strcopy速度快
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
skybyte
侠客




CU编号: 77223
注册:2003-7-30
最后登录: 2009-06-16
帖子:48
精华:0

可用积分:383 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2009-1-7 14:30 



inline void  cstrcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__(
        "1:\tlodsb\n\t"
        "stosb\n\t"
        "testb %%al,%%al\n\t"
        "jne 1b"
        : "=&S" (d0), "=&D" (d1), "=&a" (d2)
        :"0" (src),"1" (dest) : "memory");
}

用的 -O 3 来编译的
不过快得不多。

[ 本帖最后由 skybyte 于 2009-1-7 14:48 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
egmkang   帅哥 (egmkang)
天使



CU编号: 757896
注册:2008-9-5
最后登录: 2009-06-29
帖子:1052
精华:0

可用积分:1386 (家境小康)
信誉积分:0
专家积分:50 (本版:40)
空间积分:0
推广积分:0

来自:ShangHai
状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2009-1-7 16:17 

有意义么?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

说起来天下无敌, 做起来有心无力
http://www.cnblogs.com/egmkang
版主 langue   美女 (PDP-7)
版主-法王



CU编号: 463030
注册:2006-9-7
最后登录: 2009-07-05
帖子:13811
精华:0

可用积分:27959 (巨富豪门)
信誉积分:102
专家积分:126 (本版:65)
空间积分:0
推广积分:0

状态:...保密...

[个人空间] [短信] [博客]


3楼 发表于 2009-1-7 16:28 



inline void  cstrcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__(
        "1:\tlodsb\n\t"
        "stosb\n\t"
        "testb %%al,%%al\n\t"
        "jne 1b"
        : "=&S" (d0), "=&D" (d1), "=&a" (d2)
        :"0" (src),"1" (dest) : "memory");
}

lods?/stos? 是 x86 的 CPU 提供用于复制串的指令,以上代码的作用仅仅是包装一下。其实那段汇编同以下 C 代码等价:

while (*dest++ = *src++);



[ 本帖最后由 langue 于 2009-1-7 16:31 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

The PDP-7, introduced in 1965, featured the 18b product line's first mass storage operating system (DECsys, based on DECtapes). It was also the development system for the first versions of UNIX.
--
Stop arguing. There's more to do.
wangqi0021   帅哥
法师
广告杀手-天神




CU编号: 606350
注册:2007-8-22
最后登录: 2009-05-08
帖子:7352
精华:0

可用积分:2405 (小富即安)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:28

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2009-1-7 16:45 



QUOTE:
原帖由 egmkang 于 2009-1-7 16:17 发表
有意义么?

d



您对本贴的看法:鲜花[0] 臭蛋[0]
skybyte
侠客




CU编号: 77223
注册:2003-7-30
最后登录: 2009-06-16
帖子:48
精华:0

可用积分:383 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2009-1-7 16:53 

经测试     while (*a++ = *b++); 的速度和 strcpy的速度一样
但void  cstrcpy的速度要快些
用的 -O3 编译
]



您对本贴的看法:鲜花[0] 臭蛋[0]
BLZer   帅哥
风云使者



CU编号: 374607
注册:2006-2-20
最后登录: 2009-06-23
帖子:484
精华:0

可用积分:616 (丰衣足食)
信誉积分:102
专家积分:21 (本版:0)
空间积分:0
推广积分:0

来自:杭州
状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2009-1-7 17:02 

一字节一字节的搞,效率肯定不是最高的



您对本贴的看法:鲜花[0] 臭蛋[0]
eveson
大天使




CU编号: 753873
注册:2008-8-29
最后登录: 2009-07-03
帖子:1816
精华:4

可用积分:9390 (腰缠万贯)
信誉积分:5
专家积分:145 (本版:5)
空间积分:0
推广积分:98

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2009-1-7 17:03 

你如何测试的哪个快哪个慢的,我其实对你测试的技术感兴趣



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

想:一群人做同一行业,上班的时间可以一边工作一边在线交流,可能离的很远,也可能近在咫尺。
北京、嵌入式开发、linux,有一定开发经验,符合这三条就可以加进来我的qq群:40298332
rocky1972
精灵王




CU编号: 474698
注册:2006-10-10
最后登录: 2009-06-10
帖子:362
精华:0

可用积分:474 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2009-1-7 17:05 



QUOTE:
原帖由 langue 于 2009-1-7 16:28 发表
inline void  cstrcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__(
        "1:\tlodsb\n\t"
        "stosb\n\t"
        "testb %%al,%%al\n\t"
        "jne 1b"
       ...

要说快慢,测试之前先拿汇编代码比较一下,比较C代码意思不是大。因为最后执行的都是汇编指令



您对本贴的看法:鲜花[0] 臭蛋[0]
system888net   帅哥
大天使




CU编号: 304970
注册:2005-8-21
最后登录: 2009-07-04
帖子:2035
精华:1

可用积分:7936 (富足长乐)
信誉积分:100
专家积分:160 (本版:70)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2009-1-7 17:11 

有理,这个比较在汇编级别才能说的清楚.



您对本贴的看法:鲜花[0] 臭蛋[0]
skybyte
侠客




CU编号: 77223
注册:2003-7-30
最后登录: 2009-06-16
帖子:48
精华:0

可用积分:383 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2009-1-7 17:15 



#include <stdio.h>
#include <stdlib.h>
#include   <time.h>

void cstrcpy(char *a,char *b);
void  qstrcpy(char * dest,const char *src);

void cstrcpy(char *a,char *b){
    while (*a++ = *b++);
}
void  qstrcpy(char * dest,const char *src)
{
static int d0=0;
static int d1=0;
static int d2=0;
__asm__ __volatile__(
        "1:\tlodsb\n\t"
        "stosb\n\t"
        "testb %%al,%%al\n\t"
        "jne 1b"
        : "=&S" (d0), "=&D" (d1), "=&a" (d2)
        :"0" (src),"1" (dest) : "memory");
}

int main(){
    char a[10];
    char *b="bbbbbbb";
    int i;
    clock_t t_begin;

    i=0;
    t_begin=clock();
    while(i++<10000000){
        cstrcpy(a,b);
    }
    printf("cstrcpy: %lf seconds\n", (double)(clock() - t_begin) / CLOCKS_PER_SEC);

    i=0;
    t_begin=clock();
    while(i++<10000000){
        qstrcpy(a,b);
    }
    printf("qstrcpy: %lf seconds\n", (double)(clock() - t_begin) / CLOCKS_PER_SEC);

    i=0;
    t_begin=clock();
    while(i++<10000000){
        strcpy(a,b);
    }
    printf("strcpy: %lf seconds\n", (double)(clock() - t_begin) / CLOCKS_PER_SEC);
}

gcc -O3 test.c && ./a.out
cstrcpy: 0.150000 seconds
qstrcpy: 0.150000 seconds
strcpy: 0.180000 seconds

多运行几次后发觉是cstrcpy最快
cstrcpy: 0.110000 seconds
qstrcpy: 0.150000 seconds
strcpy: 0.190000 seconds

发贴的时候没这样测,是直接在程序里面改函数再计算执行时间的。

[ 本帖最后由 skybyte 于 2009-1-7 17:24 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2009 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.112081 second(s), 4 queries , Gzip enabled