2

很多人写道,这个版本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

4 回答 4

5

这些功能非常相似,以至于您不能说一般来说哪个更快。

这完全取决于编译器、它的选项和运行它的处理器。

但这可能是因为str[i]扩展为*(str + i). 因此,您+get_len2(). 但同样,智能编译器会将这样的代码撕开,并在汇编中以完全不同的方式重构它。

于 2013-08-05T14:13:46.933 回答
2

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

我提到的一个链接:请浏览此链接中的第一条和第二条评论http://www.dreamincode.net/forums/topic/99899-pointer-vs-array-speed/

于 2013-08-05T15:24:57.180 回答
2

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

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

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

同样,唯一确定的方法是针对许多不同长度的字符串运行这两个版本。然后是一个问题,即任一版本是否比仅使用strlen库函数为您购买任何东西(简短的回答:它不会)。

于 2013-08-05T14:28:03.413 回答
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;
    }
于 2013-08-05T19:18:05.870 回答