• 《高质量程序设计指南》C++题目 (strcpy 的实现)


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

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

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

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

    如果想看前面部分的答案,看上一篇文章:

    http://www.cnblogs.com/niniwzw/archive/2009/12/19/1628007.html

    标准答案是这样的:

    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倍。

    测试编译器:visual studio 2005 RTM,一次复制一个10亿长度的字符串。

    注意:经过仔细的测试,发现我上面说的有些问题,具体参考这篇文章:

     http://www.cnblogs.com/niniwzw/archive/2009/12/28/1634058.html

  • 相关阅读:
    Python学习第75天(js历史和引入,模块复习)
    Python学习第74天(抽屉习题笔记)
    Python学习第73天(shelve模块、习题练习)
    Js查漏补缺02-各种数据类型
    Js查漏补缺01-js学习笔记
    开篇
    小小python欢乐多
    阅读笔记09 个人对于三年来软件工程的一点心得
    14周周博客
    软件杯第二阶段
  • 原文地址:https://www.cnblogs.com/niniwzw/p/1630777.html
Copyright © 2020-2023  润新知