分享

《高质量程序设计指南》--strcpy 的实现

 孤鸿灬 2011-04-26

         strcpy 看似是标准函数库里面最简单的函数了,谁都可以实现这个函数,

  但是,并不一定谁都能实现的很好。林锐博士面试微软的时候,就做这个题目。

  他也没有把这个题目完全的做对。建议你自己先动手写一个自己的,不要先看

  答案。估计有 90%的人写出来的,达不到性能的要求。

  标准答案是这样的:

  static char * strcpy(char *dest, const char *src)

  {

              assert(dest != NULL && src != NULL);

              char *ret = dest;

              while ((*dest++ = *src++) != '\0');

              return ret;

  }

  测试了一下,这个函数,在10亿数据规模的复制,在我电脑上大概是 140 ms (release)

  下面的写法基本上可以判定是错误:

  static char * strcpy(char *dest, const char *src)

  {

              assert(dest != NULL && src != NULL);

              char *ret = dest;

              while ((*dest = *src) != '\0')

              {

                          dest++;

                          src++;

              }      

              return ret;

  }

  可能你会很奇怪,为什么这个是错误的。这个写法大概损失 10%的性能,而且和编译器能优化

  的程度有关。原因你看反汇编的代码就知道,指令增加了不少。因为,你要给出一个最优的结果。

  但是,似乎还有提升的可能性,  在做这个题目的时候,我首先写出来的是:

  static char * strcpy(char *dest, const char *src)

  {

              assert(dest != NULL && src != NULL);

              int i = 0;

              while (*src != '\0')

              {

                          dest[i++] = *src++;

              }

              dest[i] = '\0';

              return dest;

  }

  别看这算法简单,其实,和标准答案的速度完全一样。为什么,估计要看反汇编。

  但是,我总是不相信会这样简单,后来所有题目做好了,还有好多时间,我就想这个算法

  的优化,下面是我优化过的算法:

  static char * strcpy(char *dest, const char *src)

  {

              assert(dest != NULL && src != NULL);

              char *s = (char *)src;

              int delt = dest - src;

              while ((s[delt] = *s++) != '\0');

              return dest;

  }

  这个算法 很巧妙的回避了一个指针的累加,结果是 96ms 速度提升了近1倍

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多