获得字符串len的最有效方法是什么?

时间:2013-08-05 14:05:29

标签: c runtime

很多人写道,这个版本的get_len更快:

int get_len(char* str)
{
    char *cpy;

    cpy = str;
    while (*cpy)
    {
        ++cpy;
    }
    return (cpy - str);
}

比这个:

int get_len2(char* str)
{
    int i;

    i = 0;
    while (str[i])
    {
        i++;
    }
    return i;
}

但是当我检查运行时间时,第二个看起来更快......

所以我的问题是为什么??

这是主要的功能测试:

int main()
{
    clock_t begin, end;
    double time_spent;

    begin = clock();

    printf("%d\n", get_len("HEEEEY"));

    end = clock();

    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("%f\n", time_spent);

    begin = clock();
    printf("%d\n", get_len2("HEEEEY"));
    end = clock();

    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("%f", time_spent);

    return 0;
}

输出:

6
0.000025
6
0.000001%

4 个答案:

答案 0 :(得分:5)

这些功能非常相似,你不能说哪一个更快。

这完全取决于编译器,它的选项以及运行它的处理器。

但可能是因为str[i]扩展为*(str + i)。因此,您在+中获得了一项get_len2()次操作。但同样,智能编译器会将这样的代码分开,并在汇编时以完全不同的方式重构它。

答案 1 :(得分:2)

在获得任何有用的统计数据之前,您必须多次在不同长度的字符串上运行此测试。

由于数组访问a[j]被解释为*(a + j),因此期望在第一个示例中的直接解除引用应该比下标操作更快,这涉及添加以及解除引用。

这假设编译器没有进行任何优化,或者它对表达式进行了简单的翻译,这可能不是真的。

同样,唯一可以确定的方法是针对许多不同长度的许多字符串运行这两个版本。那么这是一个问题,是否任何一个版本只使用strlen库函数购买任何东西(简答:它不会)。

答案 2 :(得分:2)

与指针相比,数组的迭代速度更快(尽管我不自信,我从一些文章中读到它,只是试着给你一些想法)。在插入和删除的情况下指针是最好的,因为在你的程序中你只是迭代,数组使用导致较少的迭代次数。

我提到的链接之一: 请仔细阅读此链接http://www.dreamincode.net/forums/topic/99899-pointer-vs-array-speed/

中的第一条和第二条评论

答案 3 :(得分:2)

下面的代码速度慢可能有几个很好的理由:

int get_len(char* str)
{
    char *cpy; 

    cpy = str;          // does a copy of a parameter value, not necessary
    while (*cpy)
    {
        ++cpy;
    }
    return (cpy - str); // does pointer arithmetic, valid but slow
}

与以下带注释的代码比较:

int get_len2(char* str)
{
    int i;

    i = 0;             // should be one quick instruction
    while (str[i])     // same as str+i
    {
        i++;
    }
    return i;          // no pointer arithmetic
}

尝试对以下代码进行基准测试(谨慎,我自己没有编译或测试过):

int get_lena(char* str)
    {
        int i = 0;    // a string of only "\0" has length zero
        while (*str++) {i++;}
        return i;
    }